02. Promise State

A promise must be in one of three mutually exclusive states: pending, fulfilled, or rejected.

  • Pending - результат асинхронного вычисления еще не готов;

  • Fulfilled - результат вычисления выполнился успешно;

  • Rejected - во время вычислений возникла ошибка.

alt text

When pending, a promise:

  • may transition to either the fulfilled or rejected state.

When fulfilled, a promise:

  • must not transition to any other state.

  • must have a value, which must not change.

When rejected, a promise:

  • must not transition to any other state.

  • must have a reason, which must not change.

Promise является установленным (settled) если ассоциированное с Promise вычисление завершилось каким-либо образом. Установленный Promise представляет собой либо успешно вычисленный результат, либо исключение произошедшее при его вычислении.

  • Установка Promise выполняется один раз и после чего Promise хранит вычисленный результат.

  • Любая последующая установка Promise не будет иметь результата.

Promise позволяет реагировать на изменения его состояния путем установки обработчиков событий двух типов:

  • onFulfilled – срабатывают, когда promise в состоянии «выполнен успешно».

  • onRejected – срабатывают, когда promise в состоянии «выполнен с ошибкой».

Тогда, более формально:

  • A promise is fulfilled if promise.then(f) will call f "as soon as possible."

  • A promise is rejected if promise.then(undefined, r) will call r "as soon as possible."

  • A promise is pending if it is neither fulfilled nor rejected.

Общие правила:

  • В настоящее время Promise нельзя отменить, а так же нельзя узнать его текущий статус и глубину вложения.

  • Rejections Should Be Errors.

  • Rejections Should Be Used for Exceptional Situations

  • Promise-Returning Functions Should Never Throw

Promise state chaining

Если результатом Promise-а P является другой Promise T, то тогда Promise P в качестве собственного состояния будет использовать состояние из Promise T. Этот подход позволяет объединять Promise в цепочки отслеживая выполнилась или нет вся цепочка Promise.

Check Promise state

К сожалению, невозможно проверить состояние Promise вызвав какую-то функцию типа isResolved() или isRejected(). Состояние Promise определяется только тем путем через который пошел control flow выполнения его обработчиков.

Невозможно узнать успешно ли был выполнен promise без вызова then(), как и невозможно узнать об ошибке без вызова catch(). Таким образом, не существует синхронного способа узнать о выполнении асинхронной операции.

Можно реализовать следующую проверку:

Last updated

Was this helpful?