> Какие состояния бывают у промисов и какие методы у них есть в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Cyber Interactive, Garage Eight, ЛитРес, Aston, GoInvest, Сбер

Стек: JavaScript

> Пример ответа

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

У промисов три состояния: pending (ожидание), fulfilled (выполнен успешно) и rejected (выполнен с ошибкой). Основные методы: then (обработка успеха и ошибки), catch (только ошибки), finally (выполняется в любом случае). Статические методы: Promise.all, Promise.allSettled, Promise.race, Promise.any, Promise.resolve, Promise.reject.

Подробное объяснение

Промис - это объект, представляющий асинхронную операцию. Он может находиться в одном из трёх состояний:

  • pending - начальное состояние, операция ещё не завершена
  • fulfilled - операция завершена успешно, промис содержит значение
  • rejected - операция завершена с ошибкой, промис содержит причину ошибки

Переход возможен только из pending в fulfilled или rejected, после чего состояние фиксируется (immutable).

Методы экземпляра:

  • then(onFulfilled, onRejected) - возвращает новый промис, позволяет цепочку вызовов
  • catch(onRejected) - сокращение для then(null, onRejected), обрабатывает ошибки
  • finally(onFinally) - выполняется независимо от результата, не меняет значение промиса

Статические методы:

  • Promise.all(iterable) - ждёт все промисы, rejects при первом rejection
  • Promise.allSettled(iterable) - ждёт все, возвращает массив результатов с статусами
  • Promise.race(iterable) - возвращает первый завершённый промис (любой статус)
  • Promise.any(iterable) - возвращает первый fulfilled, rejects только если все rejected
  • Promise.resolve(value) - создаёт fulfilled промис
  • Promise.reject(reason) - создаёт rejected промис

На практике

Для senior-разработчика важно понимать trade-off между методами. Promise.all удобен, но опасен - одна ошибка убивает все запросы. В реальных проектах часто используют Promise.allSettled для независимых операций или Promise.any для fallback-стратегий.

Цепочки then позволяют избежать callback hell, но требуют внимания к возвращаемым значениям - каждый then создаёт новый промис. Ошибки в finally не влияют на результат, но могут быть проглочены, если не обработаны.

Пример кода

JAVASCRIPT
// Цепочка промисов с обработкой ошибок
fetch('/api/user')
.then(response => {
if (!response.ok) throw new Error('Network error');
return response.json();
})
.then(data => processUserData(data))
.catch(error => console.error('Failed:', error))
.finally(() => hideLoadingSpinner());
// Promise.allSettled для независимых запросов
const requests = [fetch('/api/a'), fetch('/api/b'), fetch('/api/c')];
Promise.allSettled(requests)
.then(results => {
const successes = results.filter(r => r.status === 'fulfilled').map(r => r.value);
const failures = results.filter(r => r.status === 'rejected').map(r => r.reason);
// частичная обработка данных
});

Как отвечать на собеседовании

Начни с базовых состояний и методов, затем переходи к практическим нюансам. Покажи понимание, когда какой метод использовать. Упомяни, что промисы - основа для async/await, и как они связаны с event loop. Для senior важно продемонстрировать знание граничных случаев: unhandled rejection, memory leaks в длинных цепочках, поведение с thenable-объектами.

Что проверяет интервьюер

  • Понимание жизненного цикла промиса и его immutable-природы
  • Знание различий между статическими методами и их use cases
  • Умение работать с асинхронными ошибками и цепочками
  • Понимание микротасков и event loop (как промисы взаимодействуют с синхронным кодом)

Типичные ошибки

  • Путаница между Promise.all и Promise.allSettled - первая ошибка убивает все
  • Забывают, что then и catch возвращают новый промис, а не мутируют текущий
  • Не обрабатывают ошибки в finally - он не перехватывает исключения
  • Используют Promise.race для таймаутов без cleanup ресурсов
  • Создают лишние обёртки: new Promise((resolve) => resolve(value)) вместо Promise.resolve(value)

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью