方法 babel 装饰器没有被执行
method babel decorators isn't executed
我正在使用 babel 7 decorator plugin,我有一个简单的 class,我想在一个简单的 try catch 包装器中装饰每个方法。
这是完成的:
const errorHandler = () => {
return (target, property, descriptor) => {
try {
return descriptor
} catch (e) {
console.error('error from the decorator', e)
}
}
}
这是我的示例 class:
class Example {
@errorHandler
addComponent() {
throw new Error('Error')
}
}
但是当我执行该函数时,它不会在执行前抛出装饰器,只会在 class 初始化时进行预评估。
有什么想法吗?
您正在返回 descriptor
,这是一个函数对象,它由 try/catch
块外的调用者执行。要拦截异常 - 你应该自己执行 descriptor
。
正确的代码是:
const errorHandler = (target, property, descriptor) => {
const original = descriptor.value;
if (typeof original === 'function') {
descriptor.value = async function(...args) {
try {
return await original.apply(this, args);
} catch (e) {
console.error('error from the decorator', e)
}
}
}
}
class Example {
@errorHandler
addComponent() {
throw new Error('Error')
}
}
new Example().addComponent();
我正在使用 babel 7 decorator plugin,我有一个简单的 class,我想在一个简单的 try catch 包装器中装饰每个方法。
这是完成的:
const errorHandler = () => {
return (target, property, descriptor) => {
try {
return descriptor
} catch (e) {
console.error('error from the decorator', e)
}
}
}
这是我的示例 class:
class Example {
@errorHandler
addComponent() {
throw new Error('Error')
}
}
但是当我执行该函数时,它不会在执行前抛出装饰器,只会在 class 初始化时进行预评估。
有什么想法吗?
您正在返回 descriptor
,这是一个函数对象,它由 try/catch
块外的调用者执行。要拦截异常 - 你应该自己执行 descriptor
。
正确的代码是:
const errorHandler = (target, property, descriptor) => {
const original = descriptor.value;
if (typeof original === 'function') {
descriptor.value = async function(...args) {
try {
return await original.apply(this, args);
} catch (e) {
console.error('error from the decorator', e)
}
}
}
}
class Example {
@errorHandler
addComponent() {
throw new Error('Error')
}
}
new Example().addComponent();