refactor(errorHandlling): handle array in callWithAsyncErrorHandling (#332)
This commit is contained in:
parent
74d8c5919d
commit
67eb29f63b
@ -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
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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(
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user