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

时间:2015-02-10 18:56:57

标签: javascript node.js promise bluebird

我正在用这种模式编写很多代码,在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解决了这个问题,其方式听起来好像上面的模式是奇怪的一样:

“如果你的代码由于某种原因需要突然插入并在承诺已经暂停一段时间后将错误处理程序附加到某些承诺上,那么你会看到恼人的消息”

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

1 个答案:

答案 0 :(得分:1)

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

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声明,这些声明需要将promises连接在一起并使链接(和错误传播)有效。