Javascript 调试DOM承诺中的异常
不久前,Chrome开发工具开始支持异步堆栈跟踪(),所以现在我们可以避免调试异步代码的痛苦 但DOM承诺()也发布了,成功地将痛苦带回来 若在承诺的代码中的某个地方抛出了任何异常,那个么它将被承诺系统吞并,即使启用了“暂停异常”,也不会让调试器停止 好的,我们可以打开“捕获异常时暂停”,但这将导致每次拒绝承诺时暂停通常是多余的。我只想捕捉各种真实的JavaScript或库错误,这些错误表明我的代码编写不正确。承诺可能会在没有逻辑错误的情况下被拒绝,但:Javascript 调试DOM承诺中的异常,javascript,asynchronous,exception-handling,error-handling,promise,Javascript,Asynchronous,Exception Handling,Error Handling,Promise,不久前,Chrome开发工具开始支持异步堆栈跟踪(),所以现在我们可以避免调试异步代码的痛苦 但DOM承诺()也发布了,成功地将痛苦带回来 若在承诺的代码中的某个地方抛出了任何异常,那个么它将被承诺系统吞并,即使启用了“暂停异常”,也不会让调试器停止 好的,我们可以打开“捕获异常时暂停”,但这将导致每次拒绝承诺时暂停通常是多余的。我只想捕捉各种真实的JavaScript或库错误,这些错误表明我的代码编写不正确。承诺可能会在没有逻辑错误的情况下被拒绝,但: function showLargeIm
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();
}
});
}
有人面临过同样的问题吗?如何调试该代码
更新:代码示例错误。异常只在“then”处理程序(而不是promise body)中包含。应该是这样的:
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;
}
});
}
简单解决方法-避免DOM承诺。他们还没有准备好生产 这是一个众所周知的问题。DOM目前的承诺是相当实验性的:
- 它们比像Bluebird这样的快速承诺实现慢得多
- 它们在Chrome中提供无
方法或未经处理的拒绝检测。例外情况将被默默地吞噬.done
- 它们提供的功能非常有限
大多数promise库,如Bluebird,都可以作为替代品。定义“写入错误”。你不是说语法错误吧?我猜:在关键部分使用try-catch,然后用错误消息拒绝?@MaxArt,我不是。我指的是上面例子中的逻辑错误。@bbuechell有什么区别?我可以评估将导致异常的代码,我可以抛出我自己的异常,或者我可以拒绝承诺。问题是一切都是一样的。这将导致拒绝承诺并捕获异常,并且调试器中没有暂停。ES6承诺在应用程序代码中不可用,请尝试具有更好错误处理和调试实用程序(如bluebird或when)的承诺库。这在2016年7月仍然相关吗?