02. Promise State
Last updated
Was this helpful?
Last updated
Was this helpful?
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 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-а P
является другой Promise T
, то тогда Promise P
в качестве собственного состояния будет использовать состояние из Promise T
. Этот подход позволяет объединять Promise в цепочки отслеживая выполнилась или нет вся цепочка Promise.
К сожалению, невозможно проверить состояние Promise вызвав какую-то функцию типа isResolved()
или isRejected()
. Состояние Promise определяется только тем путем через который пошел control flow выполнения его обработчиков.
Невозможно узнать успешно ли был выполнен promise без вызова then()
, как и невозможно узнать об ошибке без вызова catch()
. Таким образом, не существует синхронного способа узнать о выполнении асинхронной операции.
Можно реализовать следующую проверку: