refactor(errorHandlling): handle array in callWithAsyncErrorHandling (#332)

This commit is contained in:
Jooger 2019-10-22 01:59:10 +08:00 committed by Evan You
parent 74d8c5919d
commit 67eb29f63b
4 changed files with 32 additions and 60 deletions

View File

@ -20,7 +20,6 @@ import {
isFunction, isFunction,
capitalize, capitalize,
NOOP, NOOP,
isArray,
isObject, isObject,
NO, NO,
makeMap, makeMap,
@ -196,23 +195,12 @@ export function createComponentInstance(
const props = instance.vnode.props || EMPTY_OBJ const props = instance.vnode.props || EMPTY_OBJ
const handler = props[`on${event}`] || props[`on${capitalize(event)}`] const handler = props[`on${event}`] || props[`on${capitalize(event)}`]
if (handler) { if (handler) {
if (isArray(handler)) { callWithAsyncErrorHandling(
for (let i = 0; i < handler.length; i++) { handler,
callWithAsyncErrorHandling( instance,
handler[i], ErrorCodes.COMPONENT_EVENT_HANDLER,
instance, args
ErrorCodes.COMPONENT_EVENT_HANDLER, )
args
)
}
} else {
callWithAsyncErrorHandling(
handler,
instance,
ErrorCodes.COMPONENT_EVENT_HANDLER,
args
)
}
} }
} }
} }

View File

@ -12,7 +12,7 @@ return withDirectives(h(comp), [
*/ */
import { VNode } from './vnode' 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 { warn } from './warning'
import { ComponentInternalInstance } from './component' import { ComponentInternalInstance } from './component'
import { currentRenderingInstance } from './componentRenderUtils' import { currentRenderingInstance } from './componentRenderUtils'
@ -140,17 +140,8 @@ export function invokeDirectiveHook(
vnode: VNode, vnode: VNode,
prevVNode: VNode | null = null prevVNode: VNode | null = null
) { ) {
const args = [vnode, prevVNode] callWithAsyncErrorHandling(hook, instance, ErrorCodes.DIRECTIVE_HOOK, [
if (isArray(hook)) { vnode,
for (let i = 0; i < hook.length; i++) { prevVNode
callWithAsyncErrorHandling( ])
hook[i],
instance,
ErrorCodes.DIRECTIVE_HOOK,
args
)
}
} else if (isFunction(hook)) {
callWithAsyncErrorHandling(hook, instance, ErrorCodes.DIRECTIVE_HOOK, args)
}
} }

View File

@ -1,7 +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' import { isPromise, isFunction } 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.
@ -66,18 +66,24 @@ export function callWithErrorHandling(
} }
export function callWithAsyncErrorHandling( export function callWithAsyncErrorHandling(
fn: Function, fn: Function | Function[],
instance: ComponentInternalInstance | null, instance: ComponentInternalInstance | null,
type: ErrorTypes, type: ErrorTypes,
args?: any[] args?: any[]
) { ) {
const res = callWithErrorHandling(fn, instance, type, args) if (isFunction(fn)) {
if (res != null && !res._isVue && isPromise(res)) { const res = callWithErrorHandling(fn, instance, type, args)
res.catch((err: Error) => { if (res != null && !res._isVue && isPromise(res)) {
handleError(err, instance, type) 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( export function handleError(

View File

@ -1,4 +1,4 @@
import { isArray, EMPTY_OBJ } from '@vue/shared' import { EMPTY_OBJ } from '@vue/shared'
import { import {
ComponentInternalInstance, ComponentInternalInstance,
callWithAsyncErrorHandling callWithAsyncErrorHandling
@ -128,25 +128,12 @@ function createInvoker(
// and the handler would only fire if the event passed to it was fired // and the handler would only fire if the event passed to it was fired
// AFTER it was attached. // AFTER it was attached.
if (e.timeStamp >= invoker.lastUpdated - 1) { if (e.timeStamp >= invoker.lastUpdated - 1) {
const args = [e] callWithAsyncErrorHandling(
const value = invoker.value invoker.value,
if (isArray(value)) { instance,
for (let i = 0; i < value.length; i++) { ErrorCodes.NATIVE_EVENT_HANDLER,
callWithAsyncErrorHandling( [e]
value[i], )
instance,
ErrorCodes.NATIVE_EVENT_HANDLER,
args
)
}
} else {
callWithAsyncErrorHandling(
value,
instance,
ErrorCodes.NATIVE_EVENT_HANDLER,
args
)
}
} }
} }
invoker.value = initialValue invoker.value = initialValue