javascript - babel 装饰器方法没有被执行

标签 javascript babeljs 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)示例:

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

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

有什么想法吗?

最佳答案

您正在返回descriptor,它是一个函数对象,它由try/catch block 之外的调用者执行。要拦截异常 - 您应该自己执行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();

关于javascript - babel 装饰器方法没有被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51538316/

相关文章:

javascript - React ES6,如何将装饰器保存在单独的文件中

javascript - Angular Highcharts 颜色。除了 Highcharts.getOptions().colors[index] 之外还有什么方法可以获取颜色吗?

javascript - 有没有办法在 Riak 中使用 JS 库?

Javascript - 确定对 Element.children 功能的支持

javascript - react 内部div高度100%

javascript - SCRIPT1003 : Expected ':' on IE ~ Vue. js ~ MDBootstrap

Node.js 命令行脚本有时不会终止

javascript - TypeScript 类和 Webpack