通常,当未处理的拒绝发生时,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();
答案 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
都容易出错并且存在问题。本机承诺也不支持它。