Promise – это специальный объект, который содержит своё состояние. Вначале pending
(«ожидание»), затем – одно из: fulfilled
(«выполнено успешно») или rejected
(«выполнено с ошибкой»).
Подробнее о прописах по ссылке https://learn.javascript.ru/promise
Создание нового промиса осуществляется с помощью специального класса Promise
function timer() { return new Promise((resolve, reject)=> { setTimeout(()=>{ resolve("Timeout"); },2000); }); }
Класс Promise предоставляет три метода:
Пример использования промиса:
timer().then((response)=>{ // функция, возвращаемая в случае успеха console.log(response); }).catch((error)=>{ // функция, возвращаемая в случае ошибки console.log(error); }).finally(()=>{ // всегда вызывается console.log("Promise completed"); });
Цепочка промисов
Метод then возвращает новый промис, который можно использовать для дальнейшего объединения в цепочку.
Предположим, что нужно использовать несколько обратных вызовов для конкретного промиса и обработать результат один за другим.
Цепочка вызовов может быть реализована двумя способами:
timer().then(successHandler1, failureHandler1). .then(successHandler2, failureHandler2) .then(successHandler3, failuerHandler3) .then(successHandler4, failureHandler4)
failureHandler
не является обязательным в методе then. Поэтому можно использовать блок catch
для общей обработки ошибок:timer().then(successHandler1) .then(successHandler2) .then(successHandler3) .catch(errorHandler)
Совместное выполнение нескольких промисов
Иногда нужно обработать два или более промисов и запустить обработчик, когда эти промисы будут выполнены. Этого можно добиться двумя способами:
Promise.all([promise1, promise2, promise3]) .then(response => { // ответ - это массив, содержащий результаты переданных промисов }).catch(error => { // будет передаваться только первая ошибка. })
Все промисы будут выполняться независимо от их результатов. Например, если promise2 вызовет ошибку, тогда promise3 будет выполнен. Затем будет вызван обработчик catch, который передаст ошибку promise2 блоку catch. Но блок then никогда не будет выполнен.
Практика