Что выведет код 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 ошибок.

Термины по теме