如果我在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)
感谢。
答案 0 :(得分:19)
如果您有"暂停未捕获的异常" Chrome只会执行此操作在" Sources"标签
如果你取消它,它就不会因错误而暂停。
承诺拒绝 概念上是一个错误。这是精神建模的正确方法,否则以下是无声错误:
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
块中来延迟执行,这是由于then
,catch
和finally
处理程序(不是{{ 1}}构造函数tho)排队等候并延迟执行(微任务)。
Promise