> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/e-controls/e4-promises/01-promises.md).

# 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`. Может быть любая цепочка срабатываний как распределенной системе.
