我有以下代码。 并且它可以按预期工作,而不会抛出未处理的拒绝错误。
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
答案 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