Чтобы понять промисы в 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….
Не стесняйтесь комментировать ниже, если у вас есть какие-либо сомнения или предложения…..