02. Promise State
A promise must be in one of three mutually exclusive states: pending, fulfilled, or rejected.
Pending - результат асинхронного вычисления еще не готов;
Fulfilled - результат вычисления выполнился успешно;
Rejected - во время вычислений возникла ошибка.
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 callf
"as soon as possible."A promise is rejected if
promise.then(undefined, r)
will callr
"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