From 67eb29f63bb736821a317ac73c81fdb01a98c979 Mon Sep 17 00:00:00 2001 From: Jooger Date: Tue, 22 Oct 2019 01:59:10 +0800 Subject: [PATCH] refactor(errorHandlling): handle array in callWithAsyncErrorHandling (#332) --- packages/runtime-core/src/component.ts | 24 +++++-------------- packages/runtime-core/src/directives.ts | 19 ++++----------- packages/runtime-core/src/errorHandling.ts | 22 +++++++++++------- packages/runtime-dom/src/modules/events.ts | 27 ++++++---------------- 4 files changed, 32 insertions(+), 60 deletions(-) diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index a6540f67..179aa866 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 a941b90d..079573eb 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 57ed496a..a17b0546 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 7de6f1ad..d3a5f8e4 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