我意识到有一些关于preventDefault
无法正常工作的问题。但是我的问题是关于一个非常简单的情况,即您有一个async
函数并引发了错误:
throw 'error of some kind';
...,然后您希望具有“清除”功能来捕获所有此类错误。然后,它将按预期工作:
window.addEventListener('unhandledrejection', function (event) {
console.log( 'unhandled Promise rejection, event: ', event );
// event.preventDefault();
});
但是,如果我取消注释event.preventDefault()
,我希望看到throw
消息不会被打印为控制台错误。但是,它的确会打印出来。
在这种情况下,我检查以确保event
确实是cancelable
。声称是这样。
根据我的实验,PS似乎是
window.onunhandledrejection = event => {
...
};
只是为相同的“ unhandledrejection”事件实现相同的侦听器的另一种方法。使用event.preventDefault()
似乎也不起作用。
修改
经过几次实验,我似乎发现防止这种情况的唯一方法是在某个时间点吞下错误(使用try...catch
),最好是在调用中最高的async
调用中堆栈(或更确切地说,按async
函数的调用顺序)。
window.addEventListener('unhandledrejection', event => {
console.log(event.cancelable, event.reason, "unhandled rejection")
event.preventDefault()
event.stopPropagation()
event.stopImmediatePropagation()
return false
})
async function x() {
console.log('async')
throw "async error"
}
x()
new Promise(res => {
console.log('prom')
throw "prom error"
})
答案 0 :(得分:0)
在Firefox 76上进行了验证。直接承诺也不起作用。看起来像个错误。可能应该向Mozilla的Firefox跟踪器提出问题。
注意:这不是解决方案。除了提交错误并进行修复之外,是否还有其他解决方案值得怀疑。
window.onerror = msg => console.log(msg) || false
window.addEventListener('unhandledrejection', event => {
console.log(event.cancelable, event.reason, "unhandled rejection")
event.preventDefault()
event.stopPropagation()
event.stopImmediatePropagation()
return false
})
async function x() {
console.log('async')
throw "async error"
}
x()
new Promise(res => {
console.log('prom')
throw "prom error"
})