我可以防止 Chrome (v45) 在 promise 拒绝时暂停吗?
Can I prevent that Chrome (v45) pauses on promise rejections?
如果我在 Chrome 中可以看到开发人员工具并且 Promise 被拒绝,则 Chrome 会暂停 javascript 执行并显示消息 "Paused on promise rejection"。在这种情况下,我能否以某种方式阻止 Chrome 暂停(并且仍然打开 devtools)?
拒绝的承诺是我申请中 "normal" 流程的一部分,每次发生时都按 Chrome 中的恢复按钮很不方便。
您可以在 Chrome 中测试此行为,方法是在 js 控制台中输入以下内容:
new Promise(function(accept, reject) { reject(); }) // (tested in v 45.0.2454.99)
谢谢。
Chrome 仅当您在 "Sources" 选项卡中打开 "pause on uncaught exception" 时才执行此操作。
如果您取消勾选它,它不会因错误而暂停。
承诺拒绝是概念上的错误。心智建模才是正确的方法,否则以下为无声错误:
Promise.resolve().then(function(){
JSON.prase("{}"); // unhandled rejection, TypeError, typo
foooooo = 15; // unhandled ReferenceError, undefined
});
等等。
如果你想显式抑制拒绝,这类似于同步 "catch all" 你会做与同步代码相同的事情:
try {
doSomething();
} catch(e){
// explicitly ignore all errors.
}
承诺:
doSomething().catch(function(){}); // explicitly don't report rejection
有趣的是,拒绝承诺 syncronously 会引发错误,而 asynchronously 则不会。考虑这个例子:
var willIGetNewPhone = ()=>new Promise(
(resolve, reject)=>{
setTimeout(()=>{
var reason = new Error('mom is not happy');
reject(reason);
}, 1000);
}
);
willIGetNewPhone()
.catch(error=>{
console.log(error.message);
});
这段代码没有抛出异常。但是,如果 setTimeout 部分被删除,则会抛出异常。
您可以通过异步执行拒绝来解决此问题(正如@mprcela 指出的那样)。这是因为我们可以在实际拒绝执行之前添加一个 catch
处理程序。此外,如果外部 Promise 上有 catch
处理程序,它似乎不会触发暂停。
但如果catch
没有同步添加,它仍然会暂停。
我通过将拒绝包装在 then
块中来延迟执行,这是由于 then
、catch
和 finally
处理程序(不是Promise
构造函数 tho) 排队并延迟执行(微任务)。
function loadData(url) {
if (!url) {
return Promise.resolve().then(() => Promise.reject('no url'));
}
return fetch(url)
.then(res => {
if (!res.ok) {
// we are already in a then block
return Promise.reject(res.statusText);
}
// parse response as json
return res.json();
});
}
loadData()
.then(() => {
// ...
})
.catch(console.log);
如果我在 Chrome 中可以看到开发人员工具并且 Promise 被拒绝,则 Chrome 会暂停 javascript 执行并显示消息 "Paused on promise rejection"。在这种情况下,我能否以某种方式阻止 Chrome 暂停(并且仍然打开 devtools)?
拒绝的承诺是我申请中 "normal" 流程的一部分,每次发生时都按 Chrome 中的恢复按钮很不方便。
您可以在 Chrome 中测试此行为,方法是在 js 控制台中输入以下内容:
new Promise(function(accept, reject) { reject(); }) // (tested in v 45.0.2454.99)
谢谢。
Chrome 仅当您在 "Sources" 选项卡中打开 "pause on uncaught exception" 时才执行此操作。
如果您取消勾选它,它不会因错误而暂停。
承诺拒绝是概念上的错误。心智建模才是正确的方法,否则以下为无声错误:
Promise.resolve().then(function(){
JSON.prase("{}"); // unhandled rejection, TypeError, typo
foooooo = 15; // unhandled ReferenceError, undefined
});
等等。
如果你想显式抑制拒绝,这类似于同步 "catch all" 你会做与同步代码相同的事情:
try {
doSomething();
} catch(e){
// explicitly ignore all errors.
}
承诺:
doSomething().catch(function(){}); // explicitly don't report rejection
有趣的是,拒绝承诺 syncronously 会引发错误,而 asynchronously 则不会。考虑这个例子:
var willIGetNewPhone = ()=>new Promise(
(resolve, reject)=>{
setTimeout(()=>{
var reason = new Error('mom is not happy');
reject(reason);
}, 1000);
}
);
willIGetNewPhone()
.catch(error=>{
console.log(error.message);
});
这段代码没有抛出异常。但是,如果 setTimeout 部分被删除,则会抛出异常。
您可以通过异步执行拒绝来解决此问题(正如@mprcela 指出的那样)。这是因为我们可以在实际拒绝执行之前添加一个 catch
处理程序。此外,如果外部 Promise 上有 catch
处理程序,它似乎不会触发暂停。
但如果catch
没有同步添加,它仍然会暂停。
我通过将拒绝包装在 then
块中来延迟执行,这是由于 then
、catch
和 finally
处理程序(不是Promise
构造函数 tho) 排队并延迟执行(微任务)。
function loadData(url) {
if (!url) {
return Promise.resolve().then(() => Promise.reject('no url'));
}
return fetch(url)
.then(res => {
if (!res.ok) {
// we are already in a then block
return Promise.reject(res.statusText);
}
// parse response as json
return res.json();
});
}
loadData()
.then(() => {
// ...
})
.catch(console.log);