【发布时间】:2015-02-10 18:56:56
【问题描述】:
我正在用这种模式写很多代码,类似的例子可以在 Bluebird 的documentation:
var promise4 = Promise.join(promise1, promise2, function (value1, value2) {
// promise 3 needs the values resolved from promise1 and promise2
return promise3(value1, value2);
});
我的错误处理是这样完成的:
Promise.all([
promise4
])
.catch(function (err) {
// handle error
});
问题在于,如果 promise3 被拒绝,它将触发 bluebird 的 onPossiblyUnhandledRejection 处理程序,因为它在附加到任何 promise 链之前被拒绝(带有错误处理)。这会导致在没有实际问题的情况下不断打印出大量错误消息。
我不知道该怎么做,因为一方面,上述模式对于构建并发逻辑非常有用并且非常容易理解,但另一方面我不想简单地覆盖 onPossiblyUnhandledRejection因为如果我真的忘记处理某些事情,它可能会很有用。
bluebird's documentation 解决了这个问题,听起来好像上面的模式很奇怪:
“如果你的代码由于某种原因需要在承诺出现一段时间后突然介入并将错误处理程序附加到某个承诺,那么你会看到烦人的消息”
我的“某些原因”是我需要构建高度并发的软件。这是我处理这类问题的根本缺陷吗?如果没有,我应该如何在不完全删除这些警告的情况下解决这个问题?
【问题讨论】:
-
请在您的代码中显示您实际将错误处理程序附加到链的位置(和时间)。
-
所以你的错误处理程序被称为并且你得到了 unhandled-rejection 事件,大约在同一时间?这听起来像一个错误。
-
是的,这发生在我的应用程序的许多地方,但错误总是被成功捕获。如果它改变了任何东西,promise3 可能会立即被拒绝,例如带有同步逻辑的 Promise.try。
-
@TomO'Connell 我无法重现它 - 你能创建一个最小的测试用例(最好没有外部依赖项)重现问题吗?
-
更新:这是 OP 未在问题中发布的代码中的错误。
标签: javascript node.js promise bluebird