返回Bluebird中被拒绝的承诺和onPossiblyUnhandledRejection处理程序
Returned rejected promises and onPossiblyUnhandledRejection handler in Bluebird
我用这个模式写了很多代码,在Bluebird的文档中可以找到一个类似的例子:
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的文档在某种程度上解决了这个问题,使其听起来像是上面的模式是一个奇怪的模式:
"如果您的代码出于某种原因需要在某个promise挂起一段时间后突然进入并将错误处理程序附加到该promise,那么您将看到令人讨厌的消息"
我的"某些原因"是我需要构建高度并发的软件。这是我处理这类问题的根本缺陷吗?如果没有,我应该如何在不完全删除这些警告的情况下解决此问题?
正如我所评论的,您的代码运行良好,没有报告未处理的拒绝:
function promise3(value1, value2) {
return Promise.reject(new Error("the error"))
}
var promise1 = Promise.resolve();
var promise2 = Promise.resolve();
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(error) {
console.log(error.message === "the error")
});
http://jsfiddle.net/6hx0zdd2/
更有可能的是,您在某个地方忘记了return
语句,该语句是将承诺连接在一起并使链接(和错误传播)工作所必需的。
相关文章:
- 没有找到相关文章