JavaScript метод Promise.all()
JavaScript PromiseОпределение и применение
JavaScript метод .all() объекта Promise возвращает объект Promise, который имеет состояние fulfilled (успешное выполнение) в том случае, когда все переданные объекты Promise в аргументе имеют состояние fulfilled (успешное выполнение), или когда аргумент не содержит объектов Promise. Метод возвращает объект Promise, который имеет состояние rejected (выполнение отклонено) в том случае, когда один из переданных объектов изменил своё состояние на rejected (выполнение отклонено).
Этот метод может быть полезен для сбора результатов выполнения нескольких обещаний.
Поддержка браузерами
Метод | Chrome | Firefox | Opera | Safari | IExplorer | Edge |
---|---|---|---|---|---|---|
.all() | 32.0 | 29.0 | 19.0 | 8.0 | Нет | Да |
JavaScript синтаксис:
Promise.all(iterable); iterable - Array
Спецификация
ECMAScript 2015 (6th Edition, ECMA-262)Значения параметров
Параметр | Описание |
---|---|
iterable | Итерируемый объект (например, массив). Метод будет ожидать успешное выполнение всех переданных в массиве обещаний, или когда один из переданных объектов изменил своё состояние на rejected (выполнение отклонено). Если переданный объект пуст, то возвращенное обещание будет сразу переведено в состояние fulfilled (успешное выполнение). Если объект содержит одно, или несколько значений, которые не являются обещаниями, то метод разрешится с этими значениями. |
Пример использования
Базовое использования метода
const promise = new Promise(function(resolve, reject) { setTimeout(resolve, 2000, "promise1"); // изменяем состояние объекта на fulfilled (успешное выполнение) через 2 секунды }); const promise2 = new Promise(function(resolve, reject) { setTimeout(resolve, 1000, "promise2"); // изменяем состояние объекта на fulfilled (успешное выполнение) через 1 секунду }); const promise3 = new Promise(function(resolve, reject) { setTimeout(resolve, 500, "promise3"); // изменяем состояние объекта на fulfilled (успешное выполнение) через пол секунды }); Promise.all([promise, promise2, promise3]) // ожидаем выполнение всех переданных в массиве обещаний / или отклонения какого-то обещания .then(val => console.log(val)); // обработчик для успешного выполнения // ["promise1", "promise2", "promise3"]
В этом примере мы инициализировали три переменные, которые содержат объект Promise, который изменяет состояние объекта на fulfilled (успешное выполнение) через 2 секунды в первом случае, через одну секунду во втором и через пол секунды в третьем.
С использованием метода .all() объекта Promise мы принимаем массив, который содержит ссылку на три обещания, результат выполнения этого метода зависит от того с каким результатом завершится выполнение обещаний, в нашем случае он возвращает объект Promise, который имеет состояние fulfilled (успешное выполнение), так как все переданные объекты Promise в аргументе имеют состояние fulfilled (успешное выполнение).
С использованием метода then() мы добавили обработчик, вызываемый когда объект Promise имеет состояние fulfilled (успешное выполнение), и выводим в консоль полученное значение (массив полученных значений из всех обещаний).
Далее мы с Вами рассмотрим пример в котором увидим, что произойдет, если одно из обещаний будет отклонено:
const promise = new Promise(function(resolve, reject) { setTimeout(resolve, 2000, "promise1"); // изменяем состояние объекта на fulfilled (успешное выполнение) через 2 секунды }); const promise2 = new Promise(function(resolve, reject) { setTimeout(reject, 1000, new Error("Обещание отклонено")); // изменяем состояние объекта на rejected (выполнение отклонено) через 1 секунду }); const promise3 = new Promise(function(resolve, reject) { setTimeout(resolve, 500, "promise3"); // изменяем состояние объекта на fulfilled (успешное выполнение) через пол секунды }); Promise.all([promise, promise2, promise3]) // ожидаем выполнение всех переданных в массиве обещаний / или отклонения какого-то обещания .then(val => console.log(val), // обработчик для успешного выполнения err => console.log(err.message)); // обработчик для случая, когда выполнение отклонено // Обещание отклонено
По аналогии с предыдущим примером мы инициализировали три переменные, которые содержат объект Promise, который изменяет состояние объекта на fulfilled (успешное выполнение) через 2 секунды в первой и через пол секунды в третьей переменной. Обратите внимание, что с помощью метода reject() мы изменяем значение объекта Promise на rejected (выполнение отклонено) через 1 секунду во второй переменной.
С использованием метода .all() объекта Promise мы принимаем массив, который содержит ссылку на три обещания, результат выполнения этого метода зависит от того с каким результатом завершится выполнение обещаний, в нашем случае он возвращает объект Promise, который имеет состояние rejected (выполнение отклонено), это связано с тем, что один из переданных объектов изменил своё состояние на rejected (выполнение отклонено).
С использованием метода then() мы добавили обработчики, вызываемые когда объект Promise имеет состояние fulfilled (успешное выполнение), или rejected (выполнение отклонено). В нашем случае срабатывает обработчик для отклоненного выполнения, и выводит информацию об ошибке в консоль.
Нюансы использования метода
Promise.all(["Тест", "Тест2"]) .then(val => console.log(val)); // обработчик для успешного выполнения // ["Тест", "Тест2"] Promise.all([Promise.resolve(1), Promise.resolve(2)]) .then(val => console.log(val)); // обработчик для успешного выполнения // [1, 2] Promise.all([]) .then(val => console.log(val)); // обработчик для успешного выполнения // []
В этом примере мы рассмотрели основные нюансы использования метода .all(), например, если объект содержит одно, или несколько значений, которые не являются обещаниями, то метод разрешится с этими значениями. Если переданный объект пуст, то возвращенное обещание будет сразу переведено в состояние fulfilled (успешное выполнение).
JavaScript Promise