Порядок: A, E, B, C, D. Исключение в then отклоняет следующее звено цепочки; catch обрабатывает его в микрозадаче до задачи таймера.
Как catch влияет на порядок логов Promise и таймера?
Порядок: A, E, B, C, D. Исключение в then отклоняет следующее звено цепочки; catch обрабатывает его в микрозадаче до задачи таймера.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите вывод в браузере:
console.log('A');
Promise.resolve().then(() => { console.log('B'); throw new Error('x'); })
.catch(() => console.log('C'));
setTimeout(() => console.log('D'), 0);
console.log('E');
Ответ
Порядок: A, E, B, C, D. Исключение в then отклоняет следующее звено цепочки; catch обрабатывает его в микрозадаче до задачи таймера.
Throw внутри then не вылетает синхронно в окружающий код регистрации цепочки. Оно превращается в отклонённый Promise. Здесь catch ничего не бросает и завершает цепочку успешно значением undefined. Если catch отсутствовал бы, возникла бы необработанная ошибка Promise, но это не поменяло бы уже выполненные синхронные A и E.