У меня есть это сомнение относительно порядка выполнения функций Timer, микрозадач и прослушивателей событий:
let promise = Promise.reject("Err@!");
setTimeout(() => {
promise.catch(er => console.log(er, "Caught !")); // (1)
});
window.addEventListener('unhandledrejection', event => console.log("Unhandled Rejection !", event.reason)); // (2)
// Output
// >> Unhandled Rejection ! Err@!
// >> Err@! Caught !
В этом случае отклоненное обещание попадает в событие Unhandled Rejection, а затем перехватывается внутри .catch () setTimeout, причина этого в том, что
«необработанное отклонение» происходит, когда ошибка обещания не обрабатывается в конце очереди микрозадачи (https://javascript.info/microtask-queue#unhandled -отклонение )
Теперь рассмотрим другой случай:
let promise = Promise.reject("Err@!");
setTimeout(() => { // (1) ,gets called first
setTimeout(function () { // (3) , gets called at last , (after (2))
promise.catch(er => console.log("caught ", er ))
})
});
setTimeout(function () { // (2) , gets called after (1)
window.addEventListener('unhandledrejection', event => console.log("Unhandled Rejection !", event.reason));
})
// Output
//>> caught Err@!
В этом случае обработчик перехватывает обещание во вложенном setTimeout, даже когда во втором setTimeout очередь микротасков пуста, а Отклоненное обещание все еще не обработано слушателем события окна ...
Почему так?