我知道有几个关于 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"
})
最佳答案
已在 Firefox 76 上验证。直接 promise 也不起作用。看起来像一个错误。可能应该向 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"
})
关于javascript - Event.preventDefault 似乎不起作用(异步上下文),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62100577/