Чтобы понять промисы в javascript, очень важно понимать функции обратного вызова и проблемы, которые они представляют. Вы можете узнать больше об этом из моих предыдущих блогов.





Зачем нам нужны обещания?

Два основных недостатка программы обратного вызова — это ад обратного вызова и инверсия управления. Javascript обещает решить проблему инверсии управления. Промисы дают возможность узнать, когда задача завершится, а затем вернуть контроль программе/коду, чтобы решить, что делать дальше. В отличие от обратного вызова, в котором контроль над тем, что делать дальше, передается другой стороне (сторонний API/код).

Что такое обещание?
Представьте себе такой сценарий: я подхожу к прилавку в ресторане быстрого питания и делаю заказ на пасту араббиата. Я плачу сумму, а взамен кассир возвращает мне квитанцию ​​с указанным на ней номером заказа. Эта квитанция является не чем иным, как обещанием, которое гарантирует, что я в конечном итоге (в будущем) получу свою пасту или, даже если что-то пойдет не так, скажем, в ресторане закончился соус arrabbiata, тогда, по крайней мере, я могу попросить возмещение и выяснить что-нибудь еще, чтобы поесть.
По этой аналогии мы можем увидеть важную характеристику будущих ценностей: они могут указывать либо на успех, либо на неудачу. Поэтомукаждый раз, когда я заказываю макароны, я знаю, что либо получу макароны, либо получу печальные новости.

Аналогия не очень точна, промисы javascript сложнее. Но это нормально, для начала….

Как создать обещание?

let promise = new Promise( (resolve,reject) => {
// code that takes some time to execute . Eg : time to make pasta 
} )

Как изменить статус промиса?
Функция, переданная в новый промис, имеет две функции обратного вызова resolve() и reject(), которые предоставляются javascript, которые меняют статус промиса. Когда код внутри промиса выполняется, он должен вызвать одну из следующих функций обратного вызова:
- resolve(value): если код выполнен успешно, то возвращает значение. Например: по нашей аналогии, если мы успешно получаем макароны. Например: по нашей аналогии, если мы получаем печальные новости, так как в ресторане не хватало соуса arrabbiata.

Новый конструктор промиса возвращает объект промиса со следующими свойствами:
- состояние: изначально промис находится в ожидающем состоянии, то он может быть в выполненном состоянии, когда вызывается resolve(), или может быть в отклоненном состоянии. strong>, если вызывается reject().
- результат: изначально он undefined, когда вызывается resolve( value ), он содержит value или содержит ошибка, если возвращается отказ (ошибка).

Посмотрим, как будет выполняться код, на примере нашей аналогии.

В приведенном выше примере кода функция, переданная новому конструктору Promise, имеет две функции обратного вызова (resolve, reject). Код выполняется через пять секунд и в зависимости от условия разрешает или отклоняет промис, возвращая значение или ошибку. Пока выполнение кода приостановлено на пять секунд, обещание находится в состоянии Ожидание , а Результат >не определено.

Через пять секунд состояние обещания изменится с "ожидание" на "выполнено", а значение результата изменится с "неопределенное" на "разрешенное" значение(т. е. ваше Паста готова!)

Если соус arrabbiata недоступен, то обещание находится в состоянии отклонения, а результат содержит значение reject() (т.е. извините, мы не можем подать вам пасту)

Когда обещание меняет свое состояние, как вы прослушиваете изменения?
Используя свойства then(), catch() и finally(), вы можете прослушивать изменения, когда обещание меняет свое состояние.

Таким образом, обещание может находиться в одном из следующих состояний: ожидание, выполнение и отклонение. Когда обещание выполнено или находится в отклоненном состоянии, это называется обещание выполнено.

Когда обещание находится в состоянии выполнения, вы можете получить доступ к разрешенным данным в свойстве then() обещания.

Когда обещание находится в состоянии отклонения, вы можете получить доступ к информации об ошибке в свойстве catch() обещания.

Свойство final() выполняется во всех ситуациях, независимо от того, выполнено обещание или отклонено.

По сути, в зависимости от состояния промиса можно принять решение о дальнейших действиях. Продолжая нашу аналогию с макаронами, рассмотрим приведенный ниже фрагмент кода.

В примере, когда мы получаем пасту (обещание находится в состоянии выполнено), и, следовательно, выполняется код внутри then() и печатается Order a glass of coke. Также выполняется код внутри finally() и печатается I can sleep peacefully.

В примере нам нужно заказать бутерброд (обещание находится в состоянии отклонения), поэтому выполняется код внутри catch() и печатается Order a sandwhich. Кроме того, независимо от состояния промиса всегда выполняется код внутри finally.

В следующем блоге я напишу о цепочке промисов и очереди микрозадач, которые помогут вам понять важность ключевых слов async и await….

Не стесняйтесь комментировать ниже, если у вас есть какие-либо сомнения или предложения…..