isArray,
isObject,
NO,
- makeMap
+ makeMap,
+ isPromise
} from '@vue/shared'
import { SuspenseBoundary } from './suspense'
import {
currentInstance = null
currentSuspense = null
- if (
- setupResult &&
- isFunction(setupResult.then) &&
- isFunction(setupResult.catch)
- ) {
+ if (isPromise(setupResult)) {
if (__FEATURE_SUSPENSE__) {
// async setup returned Promise.
// bail here and wait for re-entry.
import { VNode } from './vnode'
import { ComponentInternalInstance, LifecycleHooks } from './component'
import { warn, pushWarningContext, popWarningContext } from './warning'
+import { isPromise } from '@vue/shared'
// contexts where user provided function may be executed, in addition to
// lifecycle hooks.
args?: any[]
) {
const res = callWithErrorHandling(fn, instance, type, args)
- if (res != null && !res._isVue && typeof res.then === 'function') {
- res.catch((err: any) => {
+ if (res != null && !res._isVue && isPromise(res)) {
+ res.catch((err: Error) => {
handleError(err, instance, type)
})
}
export const isObject = (val: any): val is Record<any, any> =>
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 toTypeString = (value: unknown): string =>
objectToString.call(value)