Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: Promise, pending, unresolved, garbage collection, memory leak

Что произойдет, если Promise не зарезолвлен?

Вопрос проверяет понимание жизненного цикла Promise и того, как JavaScript обрабатывает незавершённые асинхронные операции.

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

Если Promise не зарезолвлен (не вызван resolve или reject), он остаётся в состоянии pending навсегда. Это означает, что код, ожидающий его завершения (через then или await), никогда не выполнится. Такой Promise может привести к утечке памяти, если на него остаются ссылки, так как сборщик мусора не удалит его, пока есть активные обработчики.

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

Что такое незавершённый Promise?

Promise в JavaScript представляет собой асинхронную операцию, которая может находиться в одном из трёх состояний: pending (ожидание), fulfilled (выполнено успешно) или rejected (отклонено). Если ни resolve, ни reject не были вызваны, Promise навсегда остаётся в состоянии pending. Это означает, что цепочка then/catch или await, привязанные к нему, никогда не сработают.

Практические последствия

Незавершённый Promise не вызывает ошибку напрямую, но может привести к следующим проблемам:

  • Код, ожидающий результат, не выполняется, что может нарушить логику приложения.
  • Если на Promise есть активные ссылки (например, обработчики через then), он не будет удалён сборщиком мусора, что приводит к утечке памяти.
  • В среде Node.js незавершённые Promise могут препятствовать завершению процесса, если они зарегистрированы в event loop.

Пример кода

const unresolvedPromise = new Promise((resolve, reject) => {
  // Ни resolve, ни reject не вызываются
  console.log('Promise создан, но не завершён');
});

unresolvedPromise.then(() => {
  console.log('Этот код никогда не выполнится');
});

// Через 5 секунд Promise всё ещё в состоянии pending
setTimeout(() => console.log(unresolvedPromise), 5000);
// Вывод: Promise { <pending> }

Как избежать?

Всегда гарантируйте, что в каждом пути выполнения функции-исполнителя Promise вызывается resolve или reject. Используйте обработчики ошибок и таймауты для предотвращения зависания. В современных средах (например, Node.js) можно использовать флаги вроде --unhandled-rejections=strict для отслеживания незавершённых Promise.

Вывод: Незавершённый Promise — это источник скрытых багов и утечек памяти. Всегда завершайте Promise явно, чтобы обеспечить предсказуемое выполнение асинхронного кода.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    4

Навыки

  • JavaScript

    JavaScript

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

#Promise

#pending

#unresolved

#garbage collection

#memory leak

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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