当前位置:  开发笔记 > 编程语言 > 正文

调试DOM Promises中的异常

如何解决《调试DOMPromises中的异常》经验,为你挑选了1个好方法。

不久前,Chrome DevTools开始支持异步堆栈跟踪(http://www.html5rocks.com/en/tutorials/developertools/async-call-stack/),所以现在我们可以避免调试异步代码的痛苦.

但DOM Promises(http://www.html5rocks.com/en/tutorials/es6/promises/)也被发布,成功地带来了痛苦.

如果在承诺的代码中某处抛出任何异常,它将被promises系统吞噬,并且即使"Pause on exceptions"打开也不会让调试器停止.

好吧,我们可以打开"暂停捕获的异常",但这会导致暂停每个承诺拒绝通常是多余的.我只想捕捉各种真实的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();
        }
    });
}

有没有人遇到同样的问题?如何调试该代码?

更新:代码示例错误.仅在"then"处理程序(不在promise体中)中吞下异常.应该是这样的:

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;
        }
    });
}

Benjamin Gru.. 5

简单的解决方法 - 避免DOM承诺.他们尚未准备好生产.

这是一个已知的问题.DOM承诺目前是实验性的:

它们比像Bluebird这样的快速承诺实施要慢得多.

它们.done在Chrome中不提供任何方法或未处理的拒绝检测.异常会被默默吞噬.

它们提供了非常有限的功能子集.

如果您必须使用DOM承诺,请使用Firefox,版本27+具有基于GC的未处理拒绝检测功能.堆栈跟踪仍然比Bluebird差很多,但至少它不会默默地吞噬异常.

好处是有计划在Chrome DOM承诺中构建更好的未处理拒绝检测.

您可以使用Bluebird并将其交换为生产中的本机承诺(尽管它优于它们,并且您确实希望在生产中具有良好的可调试性).

但是我该如何处理当前的代码呢?

大多数承诺库,如Bluebird可以作为替代品.



1> Benjamin Gru..:

简单的解决方法 - 避免DOM承诺.他们尚未准备好生产.

这是一个已知的问题.DOM承诺目前是实验性的:

它们比像Bluebird这样的快速承诺实施要慢得多.

它们.done在Chrome中不提供任何方法或未处理的拒绝检测.异常会被默默吞噬.

它们提供了非常有限的功能子集.

如果您必须使用DOM承诺,请使用Firefox,版本27+具有基于GC的未处理拒绝检测功能.堆栈跟踪仍然比Bluebird差很多,但至少它不会默默地吞噬异常.

好处是有计划在Chrome DOM承诺中构建更好的未处理拒绝检测.

您可以使用Bluebird并将其交换为生产中的本机承诺(尽管它优于它们,并且您确实希望在生产中具有良好的可调试性).

但是我该如何处理当前的代码呢?

大多数承诺库,如Bluebird可以作为替代品.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有