使用Chrome进行调试时,调试器可以导航未处理异常的调用堆栈。我已经开始使用Q许诺,现在未处理的异常实际上已转换为拒绝的许诺。很好,除非涉及调试。考虑示例:
promise.done(do_work)
在do_work函数中引发的任何异常将被Q捕获,然后在下一个滴答中作为未处理的异常抛出。问题是Chrome调试器中的调用栈很无聊,仅代表Q刷新。确实,异常的stack属性是正确的,但这只是Chrome调试器中的一个工具提示,令人讨厌使用。
我已经尝试过类似的事情:
promise.done(do_work, function(e){throw e;})
但是这些异常又被Q捕获了;而且,无论如何,这无关紧要,因为到您进入错误处理程序时,堆栈已经来自下一个刻度。我也尝试过与Q.onerror和其他人一起玩,但是他们有同样的问题。
有没有一种方法可以使Q在开发过程中真正忽略某些调用的异常,以便Chrome调试器可以在Q进入下一个进程滴答之前获得一个不错的原始调用堆栈?
最佳答案
看来我找到了可行的答案。我在这里发布消息,因此它可能希望对其他人有所帮助,否则有人可以指出一种更清洁的方法,因为我认为这是一种hack。
以下工作允许在Chrome调试器中捕获do_work函数中未处理的异常。您不仅可以获得良好的调用堆栈导航,而且可以检查故障点的值和状态。
代替:
promise.done(do_work)
用:
promise.done -> setTimeout do_work, 0
或在JavaScript中:
promise.done(function(){setTimeout(do_work,0);});
有了这种hack,对do_work()的调用仍然依赖于promise的实现,但随后脱离了Q机制来捕获异常,因此可以更容易地使用Chrome调试错误。我还可以使用此模式来帮助调试承诺链中间的功能:
代替:
new_promise = promise.then(do_intermediate_work)
用:
new_promise = promise.then -> Q.promise (resolve)-> setTimeout(
->
do_intermediate_work()
resolve()
0
)
或在JavaScript中:
new_promise = promise.then(function() {
return Q.promise(function(resolve) {
setTimeout((function() {
do_intermediate_work();
resolve();
}), 0);
});
});
我希望我在这里错过了一个更好的解决方案,因为这似乎是当前工具链的可用性问题,并带有承诺进行调试。