返回Bluebird中被拒绝的承诺和onPossiblyUnhandledRejection处理程序

Returned rejected promises and onPossiblyUnhandledRejection handler in Bluebird

本文关键字:onPossiblyUnhandledRejection 处理 程序 承诺 Bluebird 拒绝 返回      更新时间:2023-09-26

我用这个模式写了很多代码,在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语句,该语句是将承诺连接在一起并使链接(和错误传播)工作所必需的。

相关文章:
  • 没有找到相关文章