所以基本上问题是Q吞下了我的异常,这些异常不是为了拒绝承诺,而是为了尽早使应用程序崩溃,以便我知道到底是什么被破坏了。
我知道我可以(并且可能应该)在链的末端使用done
方法,但是跟踪链端确实很痛苦。而且它没有多大帮助,因为它不会阻止 Q 捕获它,并且一旦缓存异常就会丢失它的堆栈跟踪。
有没有办法在抛出异常时提前崩溃,而不是将拒绝传播到链上,希望在它结束时完成?
是的,所以我的 Q PR 刚刚被合并,你现在可以这样做:
process.on("unhandledRejection", function(err, promise){
throw err; // terminate with error if a `.catch` is not attached
});
这将导致进程在未显式处理异常时退出(通过 catch
)。这结束了用承诺调试问题的漫长传奇。.done
的日子已经一去不复返了.
只要确保得到 Q 1.30,6 分钟前发布:D
您正在寻找process.exit(1)
(或任何其他退出代码),它将立即终止进程而不会引发异常。
实现此目的的一种方法是推迟 promise 回调的实际执行。这将强制函数进入事件队列,并且调用函数不会捕获此错误。
举个例子:
try {
setTimeout(function () {
throw new Error('Not caught');
});
} catch (e) {
console.log(e);
}
但是,我不确定这是否比仅使用.done
要好得多。