通常我想调用一个promise,让它以异步方式运行而不是等待它。像:
... some code ...
fetchMyCount().then(count => {
updateTheUI(count);
});
... more code ...
现在这很好用,但是我经常不会在承诺上放置一个失败处理程序,因为每个人都非常繁重。这就像在我的每次数据提取上加try {} catch {}
。
问题是,如果它失败了,它会默默地这样做。它不会抛出我的window.onerror
可以获得的异常,它不会记录,也不会执行任何操作。
现在我可以制作一个很好的包装器,如:
Async(fetchMycount().then(count => {
updateTheUI(count);
}));
一般可以处理promises,但是我必须记住包装每个异步调用。
有没有办法让像window.onerror
这样的顶级处理程序或大try {} catch {}
包装器可以捕获所有未处理的被拒绝的承诺,这样我就可以记录它们并确保它们得到固定?
答案 0 :(得分:4)
这是一个常见的用例。你的问题是真的。在Node中,您有process.on("unhandledRejection", ...
个事件you can use。可悲的是,这些在浏览器中还没有。与ES2015兼容的一些libraries承诺offer them,您可以使用这些support in browsers is coming,直到本机承诺得到支持。
好处是the polyfill,浏览器最终会支持这些钩子。
目前,我已经说服添加它,所以如果您使用core-js polyfill,您可以这样做:
window.onunhandledrejection = function(e){
// handle here e.promise e.reason
};
请注意,这假设某些内容是未处理的拒绝,如果:它未处理,并且没有同步附加错误处理程序(在任务中是准确的)。
答案 1 :(得分:1)
正是针对这样的问题,我编写了自己编写异步代码的实用程序:
https://github.com/vacuumlabs/yacol/
它对您现有的代码没有帮助,但是使用新编写的代码(以及许多其他内容)提供了相当高级的错误处理功能。
这就是说,我不认为“unhandledRejection”/“uncaughtException”事件是好的(尽管它是本地提供的最好的node.js)工具来做正确的错误处理:
首先,您只能在进程范围内附加它,因此它会强制您以相同的方式处理所有未捕获的错误(与try-catch不同,您可以对源自代码的不同部分的错误做出不同的反应) )
其次,如果在相同的事件循环运行中未将.catch附加到Promise,则会调用“unhandledRejection”。这可能导致捕获错误错误;请注意,稍后将错误处理程序附加到承诺是很好的!