Вывод: A, E, C, B, D. Синхронный код завершается первым, затем выполняется реакция Promise, после неё — два таймера в порядке постановки в этом примере.
В каком порядке выполняются Promise и два таймера?
Вывод: A, E, C, B, D. Синхронный код завершается первым, затем выполняется реакция Promise, после неё — два таймера в порядке постановки в этом примере.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В браузере выполнен один скрипт:
console.log('A');
setTimeout(() => console.log('B'), 0);
Promise.resolve().then(() => console.log('C'));
setTimeout(() => console.log('D'), 0);
console.log('E');
Других задач, влияющих на эти сообщения, нет. Определите порядок.
Ответ
Вывод: A, E, C, B, D. Синхронный код завершается первым, затем выполняется реакция Promise, после неё — два таймера в порядке постановки в этом примере.
Нулевой timeout не прерывает текущий скрипт и не означает немедленный вызов. Обработчик then ставится в очередь микрозадач; она обрабатывается до перехода к следующим задачам таймеров. Задержка таймера — не точное время исполнения: фактический запуск может быть позже из-за занятого потока. В этой задаче важен относительный порядок сообщений, а не миллисекунды.
Источник: html.spec.whatwg.org.