我可以阻止Chrome(v45)暂停拒绝承诺吗?

时间:2015-09-24 07:23:40

标签: javascript google-chrome promise es6-promise

如果我在Chrome中看到了开发人员工具并且拒绝了Promise,则Chrome会暂停javascript执行,并显示消息“Paused on promise rejection”。在这种情况下,我可以以某种方式阻止Chrome暂停(并且仍然打开devtools)吗?

拒绝承诺是我的应用程序中“正常”流程的一部分,每次发生时都按Chrome中的恢复按钮很不方便。

您可以在js-console中输入以下内容在Chrome中测试此行为:

new Promise(function(accept, reject) { reject(); }) // (tested in v 45.0.2454.99)

感谢。

3 个答案:

答案 0 :(得分:19)

如果您有"暂停未捕获的异常" Chrome只会执行此操作在" Sources"标签

enter image description here

如果你取消它,它就不会因错误而暂停。

承诺拒绝 概念上是一个错误。这是精神建模的正确方法,否则以下是无声错误:

Promise.resolve().then(function(){
    JSON.prase("{}"); // unhandled rejection, TypeError, typo
    foooooo = 15; // unhandled ReferenceError, undefined
});

等等。

如果你想明确压制拒绝,这类似于同步"赶上所有"你在同步代码中做同样的事情:

try {
   doSomething();
} catch(e){
    // explicitly ignore all errors.
}

承诺:

doSomething().catch(function(){}); // explicitly don't report rejection

答案 1 :(得分:0)

有趣的是,同步拒绝诺言会引发错误,而异步则不会。考虑以下示例:

5e814650f03d04e56fcb069000f77123c1b5273b

此代码不会引发异常。但是,如果删除 setTimeout 部分,则会引发异常。

答案 2 :(得分:0)

您可以通过异步执行拒绝来解决此问题(如@mprcela所述)。这是由于这样的事实,允许我们在执行实际拒绝之前添加catch处理程序。此外,如果外部Promise上有catch处理程序,似乎也不会触发暂停。

但是,如果未同步添加catch,它将仍然暂停。

我通过将拒绝包装在then块中来延迟执行,这是由于thencatchfinally处理程序(不是{{ 1}}构造函数tho)排队等候并延迟执行(微任务)。

Promise

https://javascript.info/microtask-queue