Как catch влияет на порядок логов Promise и таймера?

Порядок: A, E, B, C, D. Исключение в then отклоняет следующее звено цепочки; catch обрабатывает его в микрозадаче до задачи таймера.

Короткий ответ

Что ответить на собеседовании

Порядок: 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее