Вопрос проверяет понимание рекурсии в промисах и возможных проблем с переполнением стека или бесконечным ожиданием.
Когда вы создаете промис и внутри его обработчика снова вызываете тот же промис (например, через new Promise или возвращая промис из .then()), вы создаете асинхронную рекурсию. В отличие от синхронной рекурсии, которая может быстро переполнить стек вызовов, промисы используют очередь микрозадач, поэтому стек не переполняется сразу. Однако, если рекурсия бесконечна, промис никогда не разрешится, и программа зависнет в ожидании.
function recursivePromise() {
return new Promise((resolve) => {
console.log('Шаг');
// Рекурсивный вызов без условия выхода
recursivePromise().then(resolve);
});
}
recursivePromise();
// Выведет 'Шаг' бесконечно, но не переполнит стек
// Промис никогда не разрешитсяВ этом примере каждый вызов recursivePromise() создает новый промис, который ждет разрешения следующего. Так как нет базового случая, цепочка становится бесконечной, и ни один промис не завершится. Это приводит к утечке памяти и зависанию.
Чтобы избежать проблем, всегда добавляйте условие выхода. Например, можно использовать счетчик или проверку данных:
function recursivePromise(count) {
return new Promise((resolve) => {
if (count <= 0) {
resolve('Готово');
} else {
console.log('Шаг', count);
recursivePromise(count - 1).then(resolve);
}
});
}
recursivePromise(3).then(console.log);
// Выведет: Шаг 3, Шаг 2, Шаг 1, ГотовоЗдесь рекурсия останавливается, когда счетчик достигает нуля, и промис разрешается. Такой подход безопасен и не вызывает бесконечного ожидания.
Рекурсия в промисах возможна, но требует явного условия выхода. Без него вы рискуете создать бесконечную цепочку, которая никогда не завершится. Используйте рекурсию с промисами для асинхронных задач, таких как обход дерева или повторные попытки, но всегда контролируйте глубину.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию