我在 Node.js 中使用回调和出色的异步库完成了大量异步编码,效果很好。我正在尝试使用一个使用 promises 的模块,但我遇到了一个问题,即在 promise 之后抛出的任何错误仍然冒出并被 promise 错误处理程序捕获。
这使得调试错误变得非常困难,因为我不知道它们会在哪里弹出,它们不会被抛出也不会导致应用程序崩溃。
下面的示例代码;我想要做的就是退出 promise 链并在它被解决后将其留在后面,而不是捕获所有与它无关的后续错误。
function one (input, callback) {
doSomeAsyncWork(input)
.then(function (result) {
return callback(null, result);
})
.catch(function (err) {
logError(err);
return callback(err);
});
}
function two (err, result) {
if (err) { ... }
var x = callAMethodThatThrows();
...
}
one('abc', two);
在此示例中,方法 callAMethodThatThrows() 抛出一个错误,该错误被冒泡到 promise catch() block 。这可以防止应用程序崩溃并使其处于未知状态。
非常感谢任何建议,谢谢。
最佳答案
是的,很抱歉 - 我们正在修复 (1) Node.js 中的默认行为。与此同时,我指定并Petka添加(在其他人的支持下)用于查找这些错误的钩子(Hook):
process.on("unhandledRejection", (err, p) => {
console.error(err); // print the error
});
请注意,如果您自己异步执行 .catch
,这可能会捕获一些漏报 - 根据我的经验,这种情况非常罕见。
另请注意,使用 promises,您的服务器通常不会处于未知状态,您可以并且应该在合理的情况下尝试从错误中恢复。由于 promises 始终意味着抛出安全代码,因此您可以进行细粒度的错误处理。
请注意,promises 使得异步库在很大程度上变得不需要了。如果您仍然希望使用回调并且只是希望“那些讨厌的 promises”会让您一个人呆着并让您继续编写回调,那很好 - promises 是安全的,但您可以通过执行 off 的事情来避免这种情况 promise 代码:
myPromiseFn().then(v => {
process.nextTick(() => cb(null, v)); // next tick, to escape the chain
}, e => process.nextTick(() => cb(e));
请注意,公平 promise 库还带有一个 asCallback
回调,用于将 promise 代码转换为 Node 错误返回回调。
(1)有人说没问题,看图
关于javascript - Promise.catch 正在吞噬错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35995867/