Чем отличаются состояния Promise и какие переходы между ними возможны?
Асинхронность и Event Loop
У промиса три состояния и строго ограниченные переходы между ними. Состояние меняется ровно один раз и необратимо.
Состояния
- 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, либо привязан к другому промису и повторить нельзя.
Как читают состояние
Напрямую состояние не доступно — на него реагируют:
then(onFulfilled)— на fulfilled.catch(onRejected)— на rejected.finally(fn)— на любое settled.
Коротко для собеседования
Состояния: pending → fulfilled или pending → rejected, один раз и необратимо. Завершённое состояние называют settled. Первый вызов resolve/reject фиксирует результат, остальные игнорируются.