使用.done()时如何捕获Bluebird中未处理的拒绝?

时间:2015-05-06 22:22:18

标签: promise bluebird

通常,当未处理的拒绝发生时,Bluebird会发送unhandledrejection这样的事件:

// The message is logged, great!
window.addEventListener("unhandledrejection", function(e) {
    console.log("got unhandled rejection")
});
Promise.reject(new Error())

但是,只要我明确将承诺链标记为.done(),就不再发送该事件:

// The message is not logged, boo!
window.addEventListener("unhandledrejection", function(e) {
    console.log("got unhandled rejection")
});
Promise.reject(new Error()).done()

请不要粘贴样板答案"bluebird is smart enough to handle .done() for you"。我想特别询问在使用.done()时处理未捕获的拒绝问题。特别是我需要这个,因为unhandledrejection会在异步附加.catch时被触发,这在我的情况下就是这样。

在Q中,它按预期工作(虽然Q实际上要求您使用.done()完成承诺链):

Q.onerror = function() {
    console.log("got unhandled rejection")
};
Q.reject(new Error()).done();

1 个答案:

答案 0 :(得分:1)

当你调用done时,你明确要求Bluebird将拒绝转换为抛出的异常。

您可以使用window.onerror(或addEventListener副本)捕获所有这些内容。

window.onerror = function(e){
     // done makes it into a thrown exception - so catch it here.
};

P.S。

人们发布“蓝鸟足够聪明”样板的原因主要是因为它是正确的(因为它的价值Q也是1.3)。由于各种原因,在任何地方使用.done都容易出错并且存在问题。本机承诺也不支持它。