Определение порядка вывода в консоль с учётом Event Loop

Вывод: 1, 3, 4, 5, 6, 8, 9, 2, 7. Регистрация таймера в then не задерживает продолжение цепочки: следующий then получает возвращённый идентификатор таймера.

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

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

Вывод: 1, 3, 4, 5, 6, 8, 9, 2, 7. Регистрация таймера в then не задерживает продолжение цепочки: следующий then получает возвращённый идентификатор таймера.

Подробный разбор

Ответ с пояснениями

Условие

Нужно понять, какие числа будут напечатаны и в какой последовательности, учитывая работу Event Loop, а также очереди микрозадач и макрозадач.

console.log(1);

setTimeout(() => console.log(2), 0);

console.log(3);

Promise.resolve()
  .then(() => console.log(4))
  .then(() => console.log(5))
  .then(() => console.log(6))
  .then(() => setTimeout(() => console.log(7), 0))
  .then(() => {
    console.log(8);
    return 9;
  })
  .then(console.log);

Ответ

Вывод: 1, 3, 4, 5, 6, 8, 9, 2, 7. Регистрация таймера в then не задерживает продолжение цепочки: следующий then получает возвращённый идентификатор таймера.

После синхронных 1 и 3 подряд исполняются микрозадачи цепочки с 4, 5 и 6. Следующий обработчик создаёт таймер 7, но не возвращает Promise ожидания этого таймера.

Поэтому цепочка сразу продолжает микрозадачами: печатает 8, возвращает 9 и передаёт его console.log. Лишь после завершения микрозадач работают таймеры: сначала ранее поставленный 2, затем 7. Чтобы цепочка ждала таймер, надо вернуть Promise, разрешаемый его callback.

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

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

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

Подробнее