Я понимаю, что есть несколько вопросов о том, что 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"
})