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

标签 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某种程度上解决了这个问题,以一种听起来好像上面的模式很奇怪的方式:

“如果您的代码出于某种原因需要突然介入并将错误处理程序附加到某个 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 语句,它需要将 promises 连接在一起并使链接(和错误传播)起作用。

关于javascript - 在 Bluebird 中返回被拒绝的 promise 和 onPossiblyUnhandledRejection 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28439611/

相关文章:

node.js - 不太了解 Q Promise 库

node.js - 将可写 Node 流合并为一个流

json - node.js 中的只读 JSON 对象

javascript - Mongoose 有时会在 Promise 之后插入

javascript - 返回一个在所有未完成的 promise 完成后解决的 promise

node.js - NodeJs 中的 fs 转储等价物?

javascript - React(Redux + Redux Saga)和 MVC

java - 将用户输入写入 XML 文件

javascript - Jquery $.get() 和 $.ajax() 没有得到相同的结果

javascript - 在 li 上单击切换特定表