javascript - 如何捕获异步代理/反射陷阱中的错误

标签 javascript ecmascript-6

如何捕获代理处理程序中 Reflect.get(target, name,receiver) 异步抛出的错误?

我正在使用ProxyReflect包装 API 类,以便我可以捕获任何网络异常并向用户优雅地显示错误消息。

//Wrapper.js

let handler = {
  get: (target, name, receiver) => {
    try {
      Reflect.get(target, name, receiver); //throws Error asynchronously
    } catch (e) {
      console.log('caught error', e);
    }
};

export default new Proxy(new API(), handler);
//App.js

import Wrapper from './Wrapper';

Wrapper.asyncFunction(); //throws uncaught Error
//API.js

class API {
  get user() {
    return new User()
  }
}
//User.js

class User {

  /**
   * List all users
   */
  all() {
    return new Promise((resolve, reject) => {
      reject(new Error('Network error'));
    });
  }
}

当抛出错误时,Reflect.get() 内部的“捕获错误”永远不会被打印并保持未捕获状态。

最佳答案

您可以将对 Reflect.get(...)(实际 API 方法)的返回值的调用包装在一个新的 Promise 中,捕获任何错误,记录它们,然后传递它们再次开启。同样,如果没有错误,只需解析外部 Promise。

let handler = {
  get: (target, name, receiver) => {
    return (...args) => new Promise((resolve, reject) => {
      const apiMethod = Reflect.get(target, name, receiver);
      const boundApiMethod = apiMethod.bind(target);

      boundApiMethod(...args).then(resolve, (e) => {
        console.log('caught error', e);
        reject(e);
      });
    });
  }
};

您当前的代码未捕获错误,因为异步函数未就地执行,因此错误被抛出到 try block 之外。

编辑:不使用 Promise 构造函数的替代方法:

let handler = {
  get: (target, name, receiver) => {
    return (...args) => {
      return Reflect
        .get(target, name, receiver)
        .apply(target, args)
        .catch((e) => { console.log('caught error', e) });
    };
  }
};

关于javascript - 如何捕获异步代理/反射陷阱中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39164464/

相关文章:

javascript - D3 : setting style conditionally with immediately invoked arrow function and ternary

javascript - 将 JSON 字符串解析为具有精确值的 JavaScript 对象

javascript - 自动调整显示幻灯片内容的高度

javascript - ES6 析构并获取值

javascript - react-native:导入后找不到变量样式表

javascript - 如何使按选项排序的方法具有通用性?

javascript - es6 类 : Fetch in the parent class, 指的是子类中已解析的提取

javascript - 如果文本区域为空,如何在按下回车键时显示错误?

javascript - 使用 AJAX POST 发布数据

javascript - JS : can a var/object declared as const be deleted