Как будет происходить вывод в консоль при смешивании setTimeout, Promise и рекурсии

Сначала выводятся 1, 4, 6, foo1, затем 3 и бесконечная последовательность foo1. Таймеры с 2 и 5 не выполняются, пока поток микрозадач продолжается.

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

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

Сначала выводятся 1, 4, 6, foo1, затем 3 и бесконечная последовательность foo1. Таймеры с 2 и 5 не выполняются, пока поток микрозадач продолжается.

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

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

Условие

Необходимо определить последовательность вывода в консоль, когда в программу включены синхронные инструкции, микрозадачи (Promise) и макрозадачи (setTimeout), а также присутствует рекурсивный вызов функции.

console.log(1);

setTimeout(() => {
  console.log(2);
});

Promise.resolve().then(() => {
  console.log(3);
});

console.log(4);

setTimeout(() => {
  console.log(5);
}, 0);

console.log(6);

const foo1 = () => {
  console.log('foo1');
  return Promise.resolve().then(foo1);
};

foo1();

Ответ

Сначала выводятся 1, 4, 6, foo1, затем 3 и бесконечная последовательность foo1. Таймеры с 2 и 5 не выполняются, пока поток микрозадач продолжается.

Первый foo1 синхронен и ставит следующий вызов через then. Каждая микрозадача добавляет новую, поэтому очередь не опустошается. Это starvation, а не обычная синхронная рекурсия со стековым переполнением; возможны зависание и рост ресурсов. Не запускайте пример без ограничения числа итераций.

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

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

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

Подробнее