不久前Chrome DevTools开始支持异步堆栈跟踪(http://www.html5rocks.com/en/tutorials/developertools/async-call-stack/),所以现在我们可以避免调试异步代码的痛苦。
但是DOM Promises(http://www.html5rocks.com/en/tutorials/es6/promises/)也被释放,成功地带来了痛苦。
如果在承诺的代码中某处抛出任何异常,它将被promises系统吞噬,即使"暂停异常"也不会让调试器停止。是的。
好吧,我们可以打开"暂停捕获的异常"但这会导致每次承诺拒绝通常是多余的。我只想捕捉各种真实的JavaScript或库错误,表明我的代码编写错误。可能会拒绝承诺而不会出现逻辑错误:
function showLargeImage (user) {
return Promise(function (resolve, reject) {
if (!user.image.large) {
// Expected behavior. No exception pause needed.
reject('No larger image.');
} else {
// What if element doesn't exist? We want to catch exception here.
$('#user-' + user.id + '-large-image')[0].style.display = 'block';
resolve();
}
});
}
有没有人遇到同样的问题?如何调试该代码?
更新:代码示例错误。仅在"然后"中吞下例外。处理程序(不在承诺体内)。应该是这样的:
function showLargeImage (user) {
return loadLargeImage(user).then(function (largeImage) {
if (!largeImage) {
// Expected behavior. No exception pause needed.
return Promise.reject('No larger image.');
} else {
// What if element doesn't exist? We want to catch DOM exception here.
$('#user-' + user.id + '-large-image')[0].src = largeImage;
return true;
}
});
}
答案 0 :(得分:5)
简单的解决方法 - 避免DOM承诺。它们尚未准备就绪尚未。
这是一个已知问题。 DOM承诺目前是实验性的:
.done
方法或未处理的拒绝检测。例外情况将被无声吞噬。如果 使用DOM承诺,使用Firefox,版本27+具有基于GC的未处理拒绝检测功能。堆栈跟踪仍然比Bluebird差很多,但至少它不会默默地吞噬异常。
好处是有计划在Chrome DOM承诺中构建更好的未处理拒绝检测。
您可以使用Bluebird并将其换成生产中的本机承诺(尽管它优于它们,并且您确实希望在生产中具有良好的可调试性)。
大多数承诺库,如Bluebird可以作为替代品。