PassFront
  1. PassFront
  2. База знаний
  3. Асинхронность и Event Loop

Чем отличаются состояния промиса и какие переходы между ними возможны?

Асинхронность и Event Loop

У промиса три состояния: pending (ожидание), fulfilled (выполнен успешно), rejected (отклонён с ошибкой). Переходы: pending → fulfilled или pending → rejected, один раз и необратимо.

Три состояния

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

Возможные переходы

pending → fulfilled  (через resolve(value))
pending → rejected   (через reject(error) или throw)
  • Переход происходит один раз и необратим.
  • Из fulfilled/rejected перейти нельзя — они финальные (settled).
const p = new Promise((resolve, reject) => {
  resolve('ok');
  reject('поздно'); // игнорируется — переход уже был
});

Термины

  • settled — промис завершён (fulfilled или rejected).
  • resolved — «зафиксирован»: settled или привязан к другому промису.

Как читают состояние

Напрямую состояние недоступно — реагируют обработчиками:

promise
  .then((value) => {})   // на fulfilled
  .catch((error) => {})  // на rejected
  .finally(() => {});     // на любое settled

Детали

  • Первый вызов resolve/reject фиксирует результат, остальные игнорируются.
  • throw в исполнителе → rejected.
  • Коллбэки then — микрозадачи.

Коротко для собеседования

Состояния промиса: pending (ожидание) → fulfilled (успех, resolve) или pending → rejected (ошибка, reject/throw). Переход один раз и необратимо; fulfilled/rejected — финальные (settled). Первый resolve/reject фиксирует результат, остальные игнорируются. Реагируют через then/catch/finally.

Другие вопросы раздела