【问题标题】:Possibly unhandled Error when returning promise inside a promise在承诺中返回承诺时可能出现未处理的错误
【发布时间】:2014-10-29 00:54:26
【问题描述】:

我有以下代码:

SuccessfulPromise().then(function() {
    return rejectedPromise();
}).catch(function(err) {
    console.log(err);
});

我收到上述错误消息是故意的还是一个错误?错误在 catch 块中得到处理,虽然我收到了错误消息Possibly unhandled Error

【问题讨论】:

  • 你能举个例子吗?
  • 在 then 函数中成功承诺后,我使用 Promise.reject() 返回一个被拒绝的承诺。它正在测试中,所以一切都被模拟出来了。
  • 外部 catch 块在 then 函数中捕获返回的被拒绝的 promise,但仍将可能未处理的错误发送到控制台
  • 能否请您创建一个 jsFiddle 来重现该问题?
  • 请出示rejectedPromise的代码-return Promise.reject()不会重现

标签: javascript node.js promise bluebird


【解决方案1】:

你说:

问题在于sinon.stub().returns(Promise.rejected('error'))。承诺在分配给错误处理程序之前已执行。

我想指出这是正确的。当一个 Promise 被拒绝时,Bluebird 会检查链以查看是否有任何错误处理程序会处理它,如果没有,它将触发 possiblyUnhandledRejection 事件。因此,如果在分配处理程序之前发生拒绝,您会收到“虚假报告”。

但是!它被称为可能是有原因的:一旦你为它分配一个处理程序,系统仍然会检测到对该错误的处理,然后它会触发一个UnhandledRejectionHandled事件@ 987654321@。您可以使用后一个事件来确保您不会被处理后的虚假未处理拒绝所困扰。

【讨论】:

  • 谢谢,这让我得到了答案。我结束了重写我的 onPossiblyUnhandledRejection 事件处理程序以不打印任何内容。
【解决方案2】:

问题出在 sinon.stub().returns(Promise.rejected('error'))。 承诺在分配给错误处理程序之前已执行。

【讨论】:

  • 哦,原来是同一个被拒绝的promise,而且被重复了好几次?
  • 它没有被复制,只是在创建时没有得到它的错误处理程序
  • 您能否创建一个完整的可验证代码示例并打开一个问题(或更新您关闭的问题,我们将重新打开它?)
  • 谢谢。有同样的问题。你怎么修好它的?我的意思是我不想收到那个丑陋的错误信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 2020-06-17
  • 2016-11-24
相关资源
最近更新 更多