【问题标题】:Unhandled rejection error Bluebird未处理的拒绝错误 Bluebird
【发布时间】:2017-06-08 14:46:24
【问题描述】:

我有以下代码。 它可以按预期工作,不会引发未处理的拒绝错误。

p = new Promise (fulfill, reject) ->
  reject new Error 'some error'

p.catch (error) ->
  console.log error

现在,第二个代码示例确实引发了未处理的拒绝错误。 当我清楚地处理错误时,有人可以向我解释为什么会发生这种情况。

p = new Promise (fulfill, reject) ->
  reject new Error 'some error'

p.then ->
  console.log 'ok'

p.catch (error) ->
  console.log error

顺便说一句。我正在测试 chrome 和 bluebird v3.4.7

【问题讨论】:

    标签: javascript coffeescript bluebird es6-promise unhandled-exception


    【解决方案1】:

    根据error management configuration,如果在 promise 被拒绝时没有捕获处理程序注册,Bluebird 会抛出错误,而无需等待查看将来是否添加。请注意,拒绝处理程序的检查应该与设置承诺链的线程异步完成。正如他们所说,“某些编程模式会导致误报”。真的吗?

    另一方面,未捕获的异常错误不是 ES6 标准的一部分,并且实现以不同的方式处理它们:Firefox 等待或过去一直等待,直到 GC 时间,而 Chrome 超时(或曾经超时) “可能未捕获的承诺拒绝”错误。

    有关 Bluebird 的可能解决方案,请参阅 Bluebird 文档,在附加处理程序之前承诺哪个错误。


    但由于两个示例都为 promise p 同步附加了一个拒绝处理程序,因此异常的原因似乎在其他地方。

    感谢@DJ 的回答,但有不同的解释。在第二个示例中,then 返回一个承诺,如果p 被拒绝,则该承诺被拒绝,并且没有拒绝处理程序。 .then 返回的 promise 很可能是抛出错误的那个。

    【讨论】:

    • 但是,这个答案并没有解释问题中两个单独代码块之间的区别,因为当承诺被拒绝时,两者都没有安装 catch 处理程序。
    • @jfriend00 我同意答案的第一部分没有解释这个错误。我已经澄清了第二部分。
    【解决方案2】:

    当您链接 Promises 时,每个链都被视为 Promise 的新实例。

    catch()then() 类似,只是您只提供拒绝案例的处理程序。

    所以在您的示例 1 中:您的 catch() 用于处理对创建错误的原始承诺的拒绝。

    在示例 2 中:这就是说,当第一个承诺解决时,请转到第二个承诺,然后在成功和失败方面提供处理程序。您拥有的 catch() 用于处理 then() 中的函数错误,而不是第一个 Promise 提出的错误

    请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch 了解更多关于 catch 工作原理的信息

    【讨论】:

    • 但是如果您运行代码,您会看到该错误被记录到控制台以及作为未处理的拒绝错误。所以catch() 确实处理了第一个承诺中的错误。这看起来是不是有点奇怪。如果 bluebird 告诉我错误未处理,为什么 catch 仍会执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2017-04-04
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多