Event.preventDefault, похоже, не работает (asyn c context) - PullRequest
2 голосов
/ 30 мая 2020

Я понимаю, что есть несколько вопросов о том, что preventDefault не работает. Но мой вопрос касается довольно простого случая, когда у вас есть функция async, и выдается ошибка:

throw 'error of some kind';

... а затем вы хотите иметь функцию «зачистки», чтобы ловить любые и все такие ошибки. Затем это работает так, как ожидалось:

window.addEventListener('unhandledrejection', function (event) {
    console.log( 'unhandled Promise rejection, event: ', event );

    // event.preventDefault();
});

Но если я раскомментирую event.preventDefault(), я ожидаю увидеть сообщение throw not, а затем будет распечатано как ошибка на консоли. Но он всегда так печатается.

Я проверил, что event действительно соответствует cancelable в этом случае. Он утверждает, что это так.

PS из моих экспериментов кажется, что

window.onunhandledrejection = event => {
    ...
};

- это просто еще один способ реализации того же слушателя для того же события «unhandledrejection». Использование event.preventDefault(), похоже, тоже не работает.

Edit

После нескольких экспериментов я, кажется, обнаружил, что единственный способ предотвратить это заключается в том, чтобы проглотить ошибку (используя 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 голосов
/ 30 мая 2020

Проверено на 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"
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...