В примере выводятся 0, 1, 2, timer. Аргумент resolve вычисляется синхронно, поэтому рекурсивный вызов не переносится в микрозадачу.
Почему рекурсия внутри 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 выполняется сразу. Чтобы отложить шаг, нужно явно планировать его; бесконечная цепь микрозадач, однако, тоже способна задерживать работу интерфейса.