Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Почему при рекурсивном вызове в цепочке промисов Event Loop может зависнуть?

Вопрос проверяет понимание взаимодействия рекурсии, промисов и Event Loop в JavaScript, а также умение выявлять причины блокировки цикла событий.

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

Event Loop может зависнуть, если рекурсивный вызов создает бесконечную цепочку микрозадач (promise.then). Микрозадачи обрабатываются до исчерпания очереди, блокируя макрозадачи (рендеринг, ввод/вывод). Это приводит к зависанию страницы, так как Event Loop не может перейти к другим задачам.

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

Проблема рекурсии в цепочке промисов

Когда рекурсивный вызов помещается в .then() промиса, он создает новую микрозадачу. Event Loop обрабатывает все микрозадачи из очереди перед переходом к следующей макрозадаче. Если рекурсия бесконечна, очередь микрозадач никогда не опустеет, и Event Loop застрянет на их обработке.

Пример кода

function recursivePromise() {
  return Promise.resolve().then(() => {
    console.log('Microtask');
    return recursivePromise(); // бесконечная рекурсия
  });
}
recursivePromise();
// Event Loop зависает, макрозадачи не выполняются

Как это работает

  • Каждый .then() добавляет микрозадачу в очередь.
  • Event Loop перед обработкой макрозадачи (например, рендеринг) должен опустошить очередь микрозадач.
  • Бесконечная рекурсия не дает очереди опустеть, блокируя выполнение других задач.

Отличие от рекурсии с setTimeout

Если использовать setTimeout (макрозадача), рекурсия не блокирует Event Loop, так как каждая итерация планируется как отдельная макрозадача, позволяя обрабатывать другие задачи между ними.

function recursiveTimeout() {
  setTimeout(() => {
    console.log('Macrotask');
    recursiveTimeout(); // безопасно
  }, 0);
}

Вывод

Избегайте бесконечных рекурсивных вызовов через промисы, так как это блокирует Event Loop. Для рекурсивных операций с задержками используйте макрозадачи (setTimeout/setInterval) или прерывайте рекурсию по условию.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • JavaScript

    JavaScript

  • Networks

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

#event loop

#recursion

#promise

#microtask

#stack overflow

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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