refactor(runtime-core): extract promise check into shared (#325)

This commit is contained in:
Dmitry Sharshakov 2019-10-17 22:47:26 +03:00 committed by Evan You
parent bb9dca2047
commit 7305f693b1
3 changed files with 10 additions and 8 deletions

View File

@ -23,7 +23,8 @@ import {
isArray, isArray,
isObject, isObject,
NO, NO,
makeMap makeMap,
isPromise
} from '@vue/shared' } from '@vue/shared'
import { SuspenseBoundary } from './suspense' import { SuspenseBoundary } from './suspense'
import { import {
@ -281,11 +282,7 @@ export function setupStatefulComponent(
currentInstance = null currentInstance = null
currentSuspense = null currentSuspense = null
if ( if (isPromise(setupResult)) {
setupResult &&
isFunction(setupResult.then) &&
isFunction(setupResult.catch)
) {
if (__FEATURE_SUSPENSE__) { if (__FEATURE_SUSPENSE__) {
// async setup returned Promise. // async setup returned Promise.
// bail here and wait for re-entry. // bail here and wait for re-entry.

View File

@ -1,6 +1,7 @@
import { VNode } from './vnode' import { VNode } from './vnode'
import { ComponentInternalInstance, LifecycleHooks } from './component' import { ComponentInternalInstance, LifecycleHooks } from './component'
import { warn, pushWarningContext, popWarningContext } from './warning' import { warn, pushWarningContext, popWarningContext } from './warning'
import { isPromise } from '@vue/shared'
// contexts where user provided function may be executed, in addition to // contexts where user provided function may be executed, in addition to
// lifecycle hooks. // lifecycle hooks.
@ -71,8 +72,8 @@ export function callWithAsyncErrorHandling(
args?: any[] args?: any[]
) { ) {
const res = callWithErrorHandling(fn, instance, type, args) const res = callWithErrorHandling(fn, instance, type, args)
if (res != null && !res._isVue && typeof res.then === 'function') { if (res != null && !res._isVue && isPromise(res)) {
res.catch((err: any) => { res.catch((err: Error) => {
handleError(err, instance, type) handleError(err, instance, type)
}) })
} }

View File

@ -41,6 +41,10 @@ export const isSymbol = (val: any): val is symbol => typeof val === 'symbol'
export const isObject = (val: any): val is Record<any, any> => export const isObject = (val: any): val is Record<any, any> =>
val !== null && typeof val === 'object' val !== null && typeof val === 'object'
export function isPromise<T = any>(val: any): val is Promise<T> {
return isObject(val) && isFunction(val.then) && isFunction(val.catch)
}
export const objectToString = Object.prototype.toString export const objectToString = Object.prototype.toString
export const toTypeString = (value: unknown): string => export const toTypeString = (value: unknown): string =>
objectToString.call(value) objectToString.call(value)