Почему рекурсия внутри resolve остаётся синхронной

В примере выводятся 0, 1, 2, timer. Аргумент resolve вычисляется синхронно, поэтому рекурсивный вызов не переносится в микрозадачу.

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

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

В примере выводятся 0, 1, 2, timer. Аргумент resolve вычисляется синхронно, поэтому рекурсивный вызов не переносится в микрозадачу.

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

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

Условие

Разберите ограниченный пример:

function MySync(start = 0) {
  console.log(start);
  if (start === 2) return;
  return new Promise(resolve => resolve(MySync(start + 1)));
}
setTimeout(() => console.log('timer'), 0);
MySync();

Что изменится без условия остановки?

Ответ

В примере выводятся 0, 1, 2, timer. Аргумент resolve вычисляется синхронно, поэтому рекурсивный вызов не переносится в микрозадачу.

Без ограничителя рекурсия будет углублять стек и приведёт к его переполнению, а не к безопасной последовательности асинхронных шагов. Promise executor выполняется сразу. Чтобы отложить шаг, нужно явно планировать его; бесконечная цепь микрозадач, однако, тоже способна задерживать работу интерфейса.

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

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

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

Подробнее