好吧,这将是一件很糟糕的事情。
你不能
虽然许多 Promise 库允许您执行此操作并为您报告未处理的拒绝 - 在 Q 中您没有方法自动检测这些失败。
你必须Use .done
或更改承诺库。哎呀,即使是原生承诺几天后就能做到这一点.
问具体解决方案:
在 Q 中,你唯一现实的选择是使用.done
,不像then
did 不是抛出安全的,你可以从那里抛出异常,并且它们不会被抑制 - 这要求你记住始终终止链done
但它有效:
myObj.loadDataSet(handleSuccess, handleError).done(); // will throw on rejection
就我个人而言,在 Q 解决这个问题和其他问题之前,我不建议任何人使用它。
现代图书馆和原生承诺
我写了一个规格基于 Domenic 和 Petka 的工作,承诺库能够全局报告错误并挂钩它们。一些库已经实现了这一点,包括bluebird 和when。 Domenic 正在研究 Web 浏览器的并行规范。
目前支持或将在未来几周内支持的有:bluebird、when、es6-promise、rsvp 和 io 中的本机 Promise。
// log any unhandled promise rejections
process.on('unhandledRejection', function(reason, p){
console.log("Possibly Unhandled Rejection at: Promise ", p, " reason: ", reason);
// application specific logging here
});
至于浏览器,比如:
window.addEventListener("unhandledrejection", function(e) {
var reason = e.detail.reason;
var promise = e.detail.promise;
console.log("Unhandled rejection", promise, reason);
});
该协议支持较少,但有计划将其包含在本机承诺中。目前,Firefox 原生承诺将报告未处理的拒绝,Chrome 也会尝试 - 但还没有浏览器挂钩(不过它即将推出)。
请注意,团队正在开发非常有趣的工具。在与 Paul Irish 讨论之后,我相信在浏览器中调试 Promise 的工具方面将会有伟大的事情发生,这将使本机 Promise 几乎像 Bluebird Promise 一样可调试(这太棒了!)。