[英]How to catch error in asynchronous Proxy/Reflect trap
如何捕获代理处理程序中Reflect.get(target, name, receiver)
异步引发的错误?
我正在使用Proxy和Reflect来包装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()内部,“捕获的错误”将永远不会被打印,并且仍然未被捕获。
您可以在新的Promise中包装对Reflect.get(...)
(实际的API方法)的返回值的调用,捕获任何错误,记录下来,然后再次传递。 同样,如果没有错误,则只需解决外部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块之外。
编辑:一种不使用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) });
};
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.