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