01. Promises

Promise - это паттерн, использующийся для вычислений, выполняющихся асинхронно.

Asynchronous execution

Асинхронное вычисление - это вычисление, выполняющееся не последовательно за текущим вычислением в следующий момент времени (не синхронно), а какой-то последующий, достаточно произвольный момент времени (асинхронно по отношению к тому моменту, когда это вычисление было инициировано). Результат асинхронного вычисления является отложенным во времени до тех пор, пока оно не завершиться когда-то в будущем.

Promise выступает в качестве замены значения, возвращаемого асинхронной функцией, до тех пор, пока его результат не известен.

В теории, используя Promise клиент может:

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

  • Повесить на Promise обработчики на успешное или неуспешное завершение вычисления;

  • Передать результат вычисления в последующий Promise, организовав таким образом цепочку асинхронных вычислений.

В текущей реализации Promise клиент не может:

  • Проверить текущее состояние Promise (выполнилось или нет);

  • Узнать статус выполнения (успешно или неуспешно);

  • Отменить Promise

Таким образом Promise играет одновременно две роли:

  • выступает как в качестве хранилища для асинхронно вычисляемого значения.

  • выступает в качестве event emitter-а генерируя события на успешное/неуспешное вычисление Promise.

Usage of Promises

Способ использования, в общих чертах, такой:

  1. Код, которому надо сделать что-то асинхронно, запускает асинхронную операцию в Promise и возвращает его;

  2. Внешний код, получив Promise, навешивает на него обработчики;

  3. По завершении асинхронного вычисления Promise переходит в состояние успешного (с результатом) или неуспешного выполнения (с ошибкой);

  4. Автоматически вызываются соответствующие обработчики во внешнем коде.

Pros and cons of Promises

Основная область применения Promise - это отдельные асинхронные вызовы и их результаты.

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

  • После того как Promise закончил вычисление, он хранит результат вычисления.

Где могут применяться Promise:

  • Могут выступать в качестве замены асинхронно вычисляемому значению.

  • Promise можно использовать для моделирования для одномоментных событий

    • Событие произошло (да/нет)

    • Как произошло

Где не стоит применять Promise:

  • Отдельный Promise не является процессом и не подходит для моделирования процессов, однако можно сделать цепочку Promise, эмулирующую процесс.

  • Promise не подходят для моделирования событий, которые должны выполняться несколько раз.

  • Promise не очень подходят для обработки рекуррентных событий, и обработки потоков данных. If you want to use Promises for recurring values or events, there is a better mechanism/pattern for this scenario called streams.

Promises are about making asynchronous code retain most of the lost properties of synchronous code such as flat indentation and one exception channel.

Преимущества Promise:

  • Нет инверсии управления: код с promise выглядит почти как синхронный;

  • Проще делать все комбинаторы;

  • Проще обработка ошибок;

  • Проще сигнатуры методов;

  • Стандартизированы;

  • Их можно комбинировать;

  • По сравнению с функциями обратного вызова Promise позволяют упростить сигнатуры методов;

  • Обработку ошибок удобнее делать в Promise.

Event Ordering

  • Executor в Promise срабатывает синхронно, вместе с созданием объекта Promise, но еще до того, как новый Promise будет возвращен клиенту.

  • Гарантирован только порядок вызовов then и catch цепочек в пределах одного Promise.

  • Между разными Promise никаких гарантий нет. Если Promise P начал выполняться раньше Q, то это не значит, что обработчики P выполнятся раньше Q. Может быть любая цепочка срабатываний как распределенной системе.

Last updated