[英]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.