方法babel装饰器未执行

时间:2018-07-26 11:58:23

标签: javascript babel babel-decorator

我正在使用babel 7 decorator plugin,我有一个简单的类,我想在一个简单的try catch包装器中修饰每个方法。

这是做的:

const errorHandler = () => {
  return (target, property, descriptor) => {
    try {
      return descriptor
    } catch (e) {
      console.error('error from the decorator', e)
    }
  }
}

这是我班的一个例子:

class Example {
  @errorHandler
  addComponent() {
    throw new Error('Error')
  }
}

但是当我执行该函数时,它并不会在执行之前抛出装饰器,而只是在初始化类时进行预先评估。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您将返回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();