Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: promise, recursion, stack overflow, event loop, asynchronous

Что произойдёт, если в промисе рекурсивно вызывать самого себя?

Вопрос проверяет понимание рекурсии в промисах и возможных проблем с переполнением стека или бесконечным ожиданием.

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

Если в промисе рекурсивно вызывать самого себя, это может привести к бесконечному циклу или переполнению стека, если не предусмотрено условие выхода. Промисы асинхронны, поэтому рекурсия не блокирует поток, но может создать цепочку промисов, которая никогда не завершится. Важно добавлять базовый случай и избегать синхронной рекурсии.

Длинный ответ

Что происходит при рекурсивном вызове промиса?

Когда вы создаете промис и внутри его обработчика снова вызываете тот же промис (например, через 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

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#promise

#recursion

#stack overflow

#event loop

#asynchronous

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию