Чем отличаются состояния промиса и какие переходы между ними возможны?
Асинхронность и 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.