未处理的拒绝错误Bluebird

时间:2017-01-23 23:16:56

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

我有以下代码。 并且它可以按预期工作,而不会抛出未处理的拒绝错误。

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

2 个答案:

答案 0 :(得分:3)

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

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

在附加处理程序之前,请参阅Blue bird文档,了解Bluebird promises的可能解决方案。

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

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

答案 1 :(得分:3)

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

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

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

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

有关catch如何工作的更多信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch