From: Jooger Date: Mon, 21 Oct 2019 17:59:10 +0000 (+0800) Subject: refactor(errorHandlling): handle array in callWithAsyncErrorHandling (#332) X-Git-Tag: v3.0.0-alpha.0~353 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=67eb29f63bb736821a317ac73c81fdb01a98c979;p=thirdparty%2Fvuejs%2Fcore.git refactor(errorHandlling): handle array in callWithAsyncErrorHandling (#332) --- diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index a6540f6785..179aa866b8 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -20,7 +20,6 @@ import { isFunction, capitalize, NOOP, - isArray, isObject, NO, makeMap, @@ -196,23 +195,12 @@ export function createComponentInstance( const props = instance.vnode.props || EMPTY_OBJ const handler = props[`on${event}`] || props[`on${capitalize(event)}`] if (handler) { - if (isArray(handler)) { - for (let i = 0; i < handler.length; i++) { - callWithAsyncErrorHandling( - handler[i], - instance, - ErrorCodes.COMPONENT_EVENT_HANDLER, - args - ) - } - } else { - callWithAsyncErrorHandling( - handler, - instance, - ErrorCodes.COMPONENT_EVENT_HANDLER, - args - ) - } + callWithAsyncErrorHandling( + handler, + instance, + ErrorCodes.COMPONENT_EVENT_HANDLER, + args + ) } } } diff --git a/packages/runtime-core/src/directives.ts b/packages/runtime-core/src/directives.ts index a941b90d07..079573eb63 100644 --- a/packages/runtime-core/src/directives.ts +++ b/packages/runtime-core/src/directives.ts @@ -12,7 +12,7 @@ return withDirectives(h(comp), [ */ import { VNode } from './vnode' -import { isArray, isFunction, EMPTY_OBJ, makeMap } from '@vue/shared' +import { isFunction, EMPTY_OBJ, makeMap } from '@vue/shared' import { warn } from './warning' import { ComponentInternalInstance } from './component' import { currentRenderingInstance } from './componentRenderUtils' @@ -140,17 +140,8 @@ export function invokeDirectiveHook( vnode: VNode, prevVNode: VNode | null = null ) { - const args = [vnode, prevVNode] - if (isArray(hook)) { - for (let i = 0; i < hook.length; i++) { - callWithAsyncErrorHandling( - hook[i], - instance, - ErrorCodes.DIRECTIVE_HOOK, - args - ) - } - } else if (isFunction(hook)) { - callWithAsyncErrorHandling(hook, instance, ErrorCodes.DIRECTIVE_HOOK, args) - } + callWithAsyncErrorHandling(hook, instance, ErrorCodes.DIRECTIVE_HOOK, [ + vnode, + prevVNode + ]) } diff --git a/packages/runtime-core/src/errorHandling.ts b/packages/runtime-core/src/errorHandling.ts index 57ed496a75..a17b054616 100644 --- a/packages/runtime-core/src/errorHandling.ts +++ b/packages/runtime-core/src/errorHandling.ts @@ -1,7 +1,7 @@ import { VNode } from './vnode' import { ComponentInternalInstance, LifecycleHooks } from './component' import { warn, pushWarningContext, popWarningContext } from './warning' -import { isPromise } from '@vue/shared' +import { isPromise, isFunction } from '@vue/shared' // contexts where user provided function may be executed, in addition to // lifecycle hooks. @@ -66,18 +66,24 @@ export function callWithErrorHandling( } export function callWithAsyncErrorHandling( - fn: Function, + fn: Function | Function[], instance: ComponentInternalInstance | null, type: ErrorTypes, args?: any[] ) { - const res = callWithErrorHandling(fn, instance, type, args) - if (res != null && !res._isVue && isPromise(res)) { - res.catch((err: Error) => { - handleError(err, instance, type) - }) + if (isFunction(fn)) { + const res = callWithErrorHandling(fn, instance, type, args) + if (res != null && !res._isVue && isPromise(res)) { + res.catch((err: Error) => { + handleError(err, instance, type) + }) + } + return res + } + + for (let i = 0; i < fn.length; i++) { + callWithAsyncErrorHandling(fn[i], instance, type, args) } - return res } export function handleError( diff --git a/packages/runtime-dom/src/modules/events.ts b/packages/runtime-dom/src/modules/events.ts index 7de6f1add7..d3a5f8e46b 100644 --- a/packages/runtime-dom/src/modules/events.ts +++ b/packages/runtime-dom/src/modules/events.ts @@ -1,4 +1,4 @@ -import { isArray, EMPTY_OBJ } from '@vue/shared' +import { EMPTY_OBJ } from '@vue/shared' import { ComponentInternalInstance, callWithAsyncErrorHandling @@ -128,25 +128,12 @@ function createInvoker( // and the handler would only fire if the event passed to it was fired // AFTER it was attached. if (e.timeStamp >= invoker.lastUpdated - 1) { - const args = [e] - const value = invoker.value - if (isArray(value)) { - for (let i = 0; i < value.length; i++) { - callWithAsyncErrorHandling( - value[i], - instance, - ErrorCodes.NATIVE_EVENT_HANDLER, - args - ) - } - } else { - callWithAsyncErrorHandling( - value, - instance, - ErrorCodes.NATIVE_EVENT_HANDLER, - args - ) - } + callWithAsyncErrorHandling( + invoker.value, + instance, + ErrorCodes.NATIVE_EVENT_HANDLER, + [e] + ) } } invoker.value = initialValue