Что выведет код Senior Event loop обновлено
Рекурсивная микрозадача
Вопрос
Что выведет код? По строке на каждый вывод.
let count = 0;
const foo = () => {
count++;
if (count < 3) return Promise.resolve().then(foo);
return Promise.resolve();
};
setTimeout(() => console.log('таймер, count = ' + count));
foo().then(() => console.log('готово, count = ' + count));
console.log('синхронно');
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: синхронно, готово, count = 3, таймер, count = 3. Почему так На собеседовании показывали версию без ограничения: const foo = () = { console.log('foo'); return Promise.resolve().then(foo); } - она вешает страницу навсегда, потому что очередь микрозадач осушается полностью, и макрозадачи…
Что выведет
синхронно
готово, count = 3
таймер, count = 3
Разбор
Почему так
На собеседовании показывали версию без ограничения: const foo = () => { console.log('foo'); return Promise.resolve().then(foo); } - она вешает страницу навсегда, потому что очередь микрозадач осушается полностью, и макрозадачи управления не получают. Здесь ограничение добавлено, чтобы задача была разрешима, но суть та же: все рекурсивные микрозадачи отработают до первого таймера.
Вывод
синхронно
готово, count = 3
таймер, count = 3
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.