11 Модуль - Таймеры. Promise API -- 03 Promise API Flashcards
Promise (обещание, промис) —
— объект, представляющий текущее состояние асинхронной операции.
- это болванка для данных, значение которых мы не знаем в момент его создания.
У промиса есть 2 состояния:
Pending — ожидание, исходное состояние при создании промиса.
Settled — выполнен, которое в свою очередь делится на две категории: fullfilled — выполнено успешно и rejected — выполнено с ошибкой.
Вначале промис находится в состоянии ожидания (pending), после чего он может выполнится успешно (fulfilled) или с ошибкой (rejected). Когда промис переходит в состояние выполнен (settled), с результатом или ошибкой – это навсегда.
http://fecore.net.ua/books/m5ph3r-javascript/module-11/images/promise-intro.png
Promise способы использования:
– По завершении процесса асинхронный код переводит обещание в состояние fulfilled или rejected. При этом автоматически вызываются обработчики во внешнем коде.
Обещания используются в основном для
композиции, цепочки вызовов и обработки результата и ошибок в отдельных логических ветках.
Создание Promise
Обещание создается как экземпляр класса Promise с одной функцией в качестве аргумента. Вызов конструктора немедленно исполнит функцию fn, переданную в качестве аргумента. Цель этой функции состоит в информировании экземпляра (промиса), когда событие, с которым он связан, будет завершено.
resolve(arg) — функция, которую
необходимо вызвать при успешной операции. Переданный в нее аргумент будет значением выполненного промиса.
reject(arg) — функция, которую
необходимо вызвать при ошибке. Переданный в нее аргумент будет значением ошибки которое можно будет обработать.
Step by step работа промиса?
После того как промис создан, с ним можно работать используя методы then и catch, которые доступны через его прототип. Код пишется так, как будто мы размышляем о том, что может произойти если промис выполнится или нет, не думая о временных рамках.
then позволяет выполнить код, в
котором можно получить доступ и обработать результат промиса.
В метод then передаются
две функции, которые будут вызваны когда промис перейдет в состояние выполнен (settled).
promise.then(onResolve, onReject)
onResolve(arg) — будет вызвана при успешном выполнении промиса и получит результат промиса как аргумент (то, что передаем в вызов resolve).
onReject(arg) — будет вызвана при выполнении промиса с ошибкой и получит ошибку как аргумент (то, что передаем в вызов reject).
catch что делает?
Обрабатывать ошибки очень удобно, используя метод catch только один раз, в конце цепочки.
При возникновении ошибки в любом месте цепочки, выполнение всех последующих then отменяется, а управление передается методу catch.
Для чего нужен метод finally?
Функция обратного вызова не получит никаких аргументов, поскольку нельзя точно определить выполнено ли обещание или отклонено. Тут будет выполняться код, который зависит только от времени его исполнения, значение промиса не важно.
Каждый метод then, результатом своего выполнения, возвращает
промис
Что делает статический метод Promise.all() ?
Статический метод, получает массив промисов и ждет их исполнения, возвращает промис.
Promise.all([promise1, promise2, …])
При успешном выполнении всех промисов из массива, промис, возвращаемый из Promise.all, перейдет в состояние settled -> fullfilled, а его значением будет массив результатов исполнения каждого промиса.
Если в массиве промисов хотя бы один исполнился с ошибкой, то перейдет в состояние settiled -> rejected, а значением промиса будет ошибка.
Что делает статический метод Promise.race() ?
Promise.race([promise1, promise2, …])
Статический метод, получает массив промисов и возвращает обещание. Когда хотя бы одно обещание в массиве исполнилось, исполнится возвращаемый промис, а все остальные будут отброшены.