Обещания - Promise
Сегодня мы рассмотрим обещания в ES6 или как они называются по-английски Promise.
Все материалы по ES6
ES6 для начинающих (2)
До ES6 для работы с обещаниями нам приходилось использовать различные библиотеки, но теперь обещание поддерживается во всех современных браузерах.
Давайте разберемся Зачем вообще нужны эти обещания?
Очень часто мы хотим сделать чтобы что-то произошло после того, как произойдет что-то другое.
Допустим, мы кликаем на кнопку и появляется сообщение.
Традиционно, для реализации такого рода взаимодействия, используется функция обратного вызова (callbacks). Если вы когда-нибудь писали функцию которую должна сработать при нажатии на кнопку, то вы знаете что такое функция обратного вызова.
Помимо работы с событиями DOM, функция обратного вызова также используется для общения с сервером посредством ajax.
Допустим мы хотим подгрузить данные сервера.Как только мы их получим, нам нужно сначала их обработать. Далее данные необходимо проверить и только потом отобразить.
При этом мы не хотим сидеть и ждать, когда все эти операции закончится.
Приложение должно работать дальше. Если использовать функции обратного вызова для каждой из этих операций то код может превратиться в так называемый callback hell - когда у функции обратного вызова есть своя функция обратного вызова, у которой есть своя функция обратного вызова и вы вbдите как всё это выглядит.
Для маленьких приложений это не такая большая проблема, но для больших всё это может превратится в очень большую головную боль, особенно при отладке.
Если бы мы использовали обещания, то код выглядел бы следующим образом:
Заметьте насколько он компактен и легко читается.
Давайте наглядно посмотрим как работают обещание.
Допустим вы хотите поехать отдыхать в другую сторону.
Для этого вам необходимо:
- - сначала получить визу
- - забронировать номер в отеле,
- - и в конце купить билет на самолет.
Все эти действия aсинхронны. Это означает, что при подаче документов мы не будем сидеть и ждать результата. Мы пойдём заниматься дальше своими делами.
Сначала вы заполняете документы и отправлять их в посольство.
От посольства вы получаете обещание, что они дадут вам знать получили вы визу или нет.
Пока обещание выполняется оно находится в состоянии Pending ( ожидание ). Далее обещание может быть сдержанным, в таком случае она будет в состоянии Resolved, или несдержанно. В таком случае мы получим ошибку Error и обещание будет находиться в состоянии Rejected.
В зависимости от результата, вы можете спланировать свои дальнейшие действия. Если вы получаете визу тогда вы бронируете номер в отеле .Если всё хорошо, то вы покупаете билет на самолет.
Если какой-то из шагов не выполняется, то вы полностью отменяете отпуск.
Давайте посмотрим как это будет выглядеть в JavaScript.
Допустим имеется функция
applyForVisa();
- подать документы на визу.
Эта функция асинхронная и поэтому она вернет обратно - обещание.
let promise = applyForVisa();
Это обещание мы сохраним в переменной
promise
.
У обещания есть метод
.then()
что по-русски можно перевести как далее.
Данный метод принимает два аргумента.
let promise = applyForVisa(); promise.then( resolve, reject );
В качестве первого, принимается функция, которая работает в случае если обещание выполняется. В качестве второго аргумента, принимается функция которая сработает если обещание не будет выполнено.
В зависимости от результата выполнения функции
applyForVisa();
сработает либо функция resolve
или функция reject
.
В нашем случае в качестве функции
resolve
мы отправляем функцию bookHotel
или забронировать отель.
В качестве функции reject
мы отправляем cancelVacation
, то есть отменить отпуск.
Как я уже сказал, результатом
applyForVisa();
является обещание, но нам не обязательно хранить его в переменной, поэтому сразу после вызова функции applyForVisa();
мы можем использовать метод .then()
и в качестве аргументов отправить соответствующие функции.
В функцию
.then()
не обязательно отправлять два аргумента. Мы можем отправить только один - bookHotel
на тот случай если обещание будет выполнено.
Если же обещание не будет выполнено, то мы можем использовать другой метод у объекта
promise
.
Он называется
.catch()
.
applyForVisa() .then( bookHotel ) .catch( cancelVacation );
Он принимает лишь один аргумент, которым будет являться функция, которая должна сработать если обещали не будет выполнено.
В данном случае
cancelVacation
.
Метод
.catch()
имеет смысл использовать если у нас имеется несколько шагов.
applyForVisa() .then( bookHotel ) .then( buyTickeys ) .catch( cancelVacation );
То есть мы бронируем отель - bookHotel.
Далее Мы покупаем билеты buyTickeys
и если вдруг на каком-то из шагов происходит ошибка, то мы и ловим (.catch) функцией cancelVacation.
Заметьте как просто читается код.
- Подать заявление на визу.
- Далее - забронировать отель.
- Далее - купить билеты.
- В случае если что-то не получится, то - отменить отпуск.
По сути, обещания делают тоже самое, что и функции обратного вызова. Более того, мы и используем функции обратного вызова!
Отличается то, как мы пишем код.Его структура.Её гораздо проще понимать.
Теперь, перейдем к созданию собственных обещаний.
Комментариев нет:
Отправить комментарий