【问题标题】:Returned rejected promises and onPossiblyUnhandledRejection handler in Bluebird在 Bluebird 中返回被拒绝的承诺和 onPossiblyUnhandledRejection 处理程序
【发布时间】:2015-02-10 18:56:56
【问题描述】:

我正在用这种模式写很多代码,类似的例子可以在 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 解决了这个问题,听起来好像上面的模式很奇怪:

“如果你的代码由于某种原因需要在承诺出现一段时间后突然介入并将错误处理程序附加到某个承诺,那么你会看到烦人的消息”

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

【问题讨论】:

  • 请在您的代码中显示您实际将错误处理程序附加到链的位置(和时间)。
  • 所以你的错误处理程序被称为并且你得到了 unhandled-rejection 事件,大约在同一时间?这听起来像一个错误。
  • 是的,这发生在我的应用程序的许多地方,但错误总是被成功捕获。如果它改变了任何东西,promise3 可能会立即被拒绝,例如带有同步逻辑的 Promise.try。
  • @TomO'Connell 我无法重现它 - 你能创建一个最小的测试用例(最好没有外部依赖项)重现问题吗?
  • 更新:这是 OP 未在问题中发布的代码中的错误。

标签: javascript node.js promise bluebird


【解决方案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 语句,该语句需要将 Promise 连接在一起并使链接(和错误传播)起作用。

【讨论】:

  • 我倾向于同意您的观点,因为我构建了自己的孤立示例并且没有看到问题所在。不过,我还没有发现我的实际代码有任何问题。
  • @TomO'Connell 您能否尝试启用长堆栈跟踪并跟踪跟踪。例如,在这个 jsfiddle 中,我忘记了返回,但您可以按照记录的跟踪来查看它发生在哪里 jsfiddle.net/6hx0zdd2/1
  • 刚试过这个。在所有情况下,被拒绝的承诺肯定会被退回。仍在寻找原因。我想我应该再次提到我的错误处理实际上是按预期工作的。我现在看到这个问题的地方是当我使用故意错误的数据为我的 API 运行 mocha 测试时。错误被捕获并按预期处理,但我仍然看到此消息。
  • 我想通了。这是因为我的错误处理程序与 Promise 链开始的地方不同。
  • @TomO'Connell nvm 我看到你更新了......只是带有长跟踪的 2.8.0+ 应该很容易找到未处理错误的来源
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
相关资源
最近更新 更多