refactor: call instead of wrap

This commit is contained in:
Evan You 2019-08-30 12:22:41 -04:00
parent 3d681f8bcd
commit 7fe82398f7
2 changed files with 18 additions and 23 deletions

View File

@ -4,7 +4,7 @@ import {
currentInstance,
setCurrentInstance
} from './component'
import { applyErrorHandling, ErrorTypeStrings } from './errorHandling'
import { callUserFnWithErrorHandling, ErrorTypeStrings } from './errorHandling'
import { warn } from './warning'
import { capitalize } from '@vue/shared'
@ -14,14 +14,12 @@ function injectHook(
target: ComponentInstance | null = currentInstance
) {
if (target) {
// wrap user hook with error handling logic
const withErrorHandling = applyErrorHandling(hook, target, type)
;(target[type] || (target[type] = [])).push((...args: any[]) => {
// Set currentInstance during hook invocation.
// This assumes the hook does not synchronously trigger other hooks, which
// can only be false when the user does something really funky.
setCurrentInstance(target)
const res = withErrorHandling(...args)
const res = callUserFnWithErrorHandling(hook, target, type, args)
setCurrentInstance(null)
return res
})

View File

@ -37,17 +37,15 @@ export const ErrorTypeStrings: Record<number | string, string> = {
type ErrorTypes = LifecycleHooks | UserExecutionContexts
// takes a user-provided function and returns a verison that handles potential
// errors (including async)
export function applyErrorHandling<T extends Function>(
fn: T,
export function callUserFnWithErrorHandling(
fn: Function,
instance: ComponentInstance | null,
type: ErrorTypes
): T {
return function errorHandlingWrapper(...args: any[]) {
type: ErrorTypes,
args?: any[]
) {
let res: any
try {
res = fn(...args)
res = args ? fn(...args) : fn()
if (res && !res._isVue && typeof res.then === 'function') {
;(res as Promise<any>).catch(err => {
handleError(err, instance, type)
@ -57,7 +55,6 @@ export function applyErrorHandling<T extends Function>(
handleError(err, instance, type)
}
return res
} as any
}
export function handleError(