Event.preventDefault似乎不起作用(异步上下文)

时间:2020-05-30 09:37:18

标签: javascript firefox error-handling promise unhandled-exception

我意识到有一些关于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"
})

1 个答案:

答案 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"
})

相关问题