未处理的拒绝错误 Bluebird

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

I have the following code. And it works as expected without throwing a unhandled rejection error.

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

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

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

Now, the second code example does throw an unhandled rejection error. Can someone explain to me why this is happening when im clearly handling the 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

Btw. I'm testing in chrome and bluebird v3.4.7

推荐答案

根据 错误管理配置 如果没有捕获处理程序注册,Bluebird 会抛出一个错误,而不会等待将来是否添加.请注意,拒绝处理程序的检查应该与设置承诺链的线程异步完成.正如他们所说,某些编程模式会导致误报".真的吗?

Per error management configuration Bluebird throws an error if there is no catch handler registered when a promise is rejected, without waiting to see if one is added in the future. Note that checking for a rejection handler should be done asynchronously to the thread which set up the promise chain. As they say, "some programming patterns will result in false positives". Yes really?

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

On the other hand, uncaught exception errors are not part of the ES6 standard and implementations handle them in different ways: Firefox waits, or used to wait, until GC time whereas Chrome times out (or used to time out) with a "possible uncaught promise rejection" error.

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

Consult Blue bird documentation for possible solutions for Bluebird promises which error before attaching a handler.

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

But since both examples synchronously attach a reject handler for promise p, the reason for the exception appears to lie elsewhere.

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

With thanks to @DJ 's answer but with a different interpretation. In the second example, then returns a promise which is rejected if p is rejected, and does not have a rejection handler. The promise returned by .then is likely to be the one throwing the error.

相关文章