在Bluebird中返回被拒绝的promise和onPossiblyUnhandledRejection处理程序

我正在用这个模式编写很多代码,在Bluebird的文档中可以find类似的例子:

var promise4 = Promise.join(promise1, promise2, function (value1, value2) { // promise 3 needs the values resolved from promise1 and promise2 return promise3(value1, value2); }); 

我的error handling是这样完成的:

 Promise.all([ promise4 ]) .catch(function (err) { // handle error }); 

问题是,如果promise3被拒绝,它会触发蓝鸟的onPossiblyUnhandledRejection处理程序,因为它被连接到任何承诺链(具有error handling)之前被拒绝。 当没有任何事情是错误的时候,这会导致大的错误信息被打印出来。

我不知道该怎么做,因为一方面,上面的模式对于构造并发逻辑非常有用,而且很容易理解,但是另一方面,我不想简单地覆盖onPossiblyUnhandledRejection,因为它可以如果我真的忘记处理一些事情

蓝鸟的文档types解决了这个问题,使得它听起来好像上面的模式是一个奇怪的:

“如果你的代码由于某种原因需要突然冒出来,并附上error handling程序的承诺后一些承诺挂了一段时间,然后你会看到恼人的消息”

我的“某些原因”是我需要构build高度并发的软件。 这是我接近这种问题的根本缺陷吗? 如果没有,我应该如何解决这个问题,而不是完全删除这些警告?

正如我评论你的代码工作得很好,没有报告未处理的拒绝:

 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承诺连接在一起并使链接(和错误传播)工作所需的return声明。