Mas*_*len 2 javascript ecmascript-6
如何捕获由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()内部,“捕获的错误”将永远不会被打印,并且仍然未被捕获。
您可以Reflect.get(...)在新的Promise中包装对(实际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);
});
});
}
};
Run Code Online (Sandbox Code Playgroud)
您的当前代码未捕获到该错误,因为异步函数未就地执行,因此该错误被抛出到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) });
};
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
862 次 |
| 最近记录: |