Сначала выводятся 1, 4, 6, foo1, затем 3 и бесконечная последовательность foo1. Таймеры с 2 и 5 не выполняются, пока поток микрозадач продолжается.
Как будет происходить вывод в консоль при смешивании setTimeout, Promise и рекурсии
Сначала выводятся 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, а не обычная синхронная рекурсия со стековым переполнением; возможны зависание и рост ресурсов. Не запускайте пример без ограничения числа итераций.