未处理的拒绝错误Bluebird

Iva*_*ira 5 javascript unhandled-exception coffeescript bluebird es6-promise

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

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

p.catch (error) ->
  console.log error
Run Code Online (Sandbox Code Playgroud)

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

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

p.then ->
  console.log 'ok'

p.catch (error) ->
  console.log error
Run Code Online (Sandbox Code Playgroud)

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

tra*_*r53 4

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

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

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


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

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