--- title: Promise.all() slug: Web/JavaScript/Reference/Global_Objects/Promise/all tags: - ECMAScript 2015 - JavaScript - Promise - метод translation_of: Web/JavaScript/Reference/Global_Objects/Promise/all ---
{{JSRef}}

Метод Promise.all() повертає єдиний {{jsxref("Promise","проміс")}}, який виконується, коли усі проміси, передані у вигляді ітерабельного об'єкта, були виконані, або коли ітерабельний об'єкт не містить жодного проміса. Він відхиляється з причиною першого відхиленого проміса.

Зазвичай використовується після того, як були запущені асинхронні задачі, що виконуються конкурентно, та були створені проміси для їхніх результатів, щоб мати змогу зачекати, доки усі задачі не будуть виконані.

{{EmbedInteractiveExample("pages/js/promise-all.html")}}

Синтаксис

Promise.all(iterable);

Параметри

iterable
Ітерабельний об'єкт, такий як {{jsxref("Array")}}.

Значення, що повертається

Опис

Цей метод може бути корисним для збирання результатів множини промісів.

Виконання

Повернений проміс виконується з масивом, що містить усі значення ітерабельного об'єкта, переданого в якості аргумента (також значення, що не є промісами).

Відхилення

Якщо будь-який з переданих промісів відхиляється, Promise.all асинхронно відхиляється зі значенням відхиленого проміса, незалежно від того, чи були вирішені інші проміси.

Приклади

Використання Promise.all

Promise.all чекає на усі виконання (або на перше відхилення).

var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("foo");
  }, 100);
});

Promise.all([p1, p2, p3]).then(values => {
  console.log(values); // [3, 1337, "foo"]
});

Якщо ітерабельний об'єкт містить значення, що не є промісами, вони будуть проігноровані, але все одно міститимуться у поверненому масиві проміса (якщо проміс виконається):

// рахуватиметься, ніби передано порожній ітерабельний об'єкт, отже, він виконається
var p = Promise.all([1,2,3]);
// рахуватиметься, ніби переданий ітерабельний об'єкт містить лише вирішений проміс зі значенням "444", отже, він виконається
var p2 = Promise.all([1,2,3, Promise.resolve(444)]);
// рахуватиметься, ніби переданий ітерабельний об'єкт містить лише відхилений проміс зі значенням "555", отже, він буде відхилений
var p3 = Promise.all([1,2,3, Promise.reject(555)]);

// використовуючи setTimeout, ми можемо виконати код після того, як стек стане порожнім
setTimeout(function() {
    console.log(p);
    console.log(p2);
    console.log(p3);
});

// виводить
// Promise { <state>: "fulfilled", <value>: Array[3] }
// Promise { <state>: "fulfilled", <value>: Array[4] }
// Promise { <state>: "rejected", <reason>: 555 }

Асинхронність або синхронність Promise.all

Наступний приклад демонструє асинхронність (або синхронність, якщо передано порожній ітерабельний об'єктPromise.all:

// ми передаємо в якості аргумента масив вже вирішених промісів,
// щоб запустити Promise.all якомога швидше
var resolvedPromisesArray = [Promise.resolve(33), Promise.resolve(44)];

var p = Promise.all(resolvedPromisesArray);
// негайно виводимо значення p
console.log(p);

// використовуючи setTimeout, ми можемо виконати код після того, як стек стане порожнім
setTimeout(function() {
    console.log('стек тепер порожній');
    console.log(p);
});

// виводить, в порядку:
// Promise { <state>: "pending" }
// стек тепер порожній
// Promise { <state>: "fulfilled", <value>: Array[2] }

Те саме відбувається, якщо Promise.all відхиляється:

var mixedPromisesArray = [Promise.resolve(33), Promise.reject(44)];
var p = Promise.all(mixedPromisesArray);
console.log(p);
setTimeout(function() {
    console.log('стек тепер порожній');
    console.log(p);
});

// виводить
// Promise { <state>: "pending" }
// стек тепер порожній
// Promise { <state>: "rejected", <reason>: 44 }

Promise.all вирішується синхронно лише тоді, коли переданий ітерабельний об'єкт є порожнім:

var p = Promise.all([]); // буде негайно вирішений
// значення, що не є промісами, будуть проігноровані, але обчислення відбуватиметься асинхронно
var p2 = Promise.all([1337, "привіт"]);
console.log(p);
console.log(p2)
setTimeout(function() {
    console.log('стек тепер порожній');
    console.log(p2);
});

// виводить
// Promise { <state>: "fulfilled", <value>: Array[0] }
// Promise { <state>: "pending" }
// стек тепер порожній
// Promise { <state>: "fulfilled", <value>: Array[2] }

Швидке відхилення у Promise.all

Promise.all відхиляється, якщо будь-який з його елементів було відхилено. Наприклад, якщо ви передаєте чотири проміси, які вирішуються після затримки, та один проміс, який негайно відхиляється, тоді Promise.all буде негайно відхилено.

var p1 = new Promise((resolve, reject) => {
  setTimeout(() => resolve('один'), 1000);
});
var p2 = new Promise((resolve, reject) => {
  setTimeout(() => resolve('два'), 2000);
});
var p3 = new Promise((resolve, reject) => {
  setTimeout(() => resolve('три'), 3000);
});
var p4 = new Promise((resolve, reject) => {
  setTimeout(() => resolve('чотири'), 4000);
});
var p5 = new Promise((resolve, reject) => {
  reject(new Error('відхилено'));
});


// Використовуємо .catch:
Promise.all([p1, p2, p3, p4, p5])
.then(values => {
  console.log(values);
})
.catch(error => {
  console.error(error.message)
});

//Виведе:
//"відхилено"

Цю поведінку можливо змінити, обробивши можливі відхилення:

var p1 = new Promise((resolve, reject) => {
  setTimeout(() => resolve('p1_відкладене_вирішення'), 1000);
});

var p2 = new Promise((resolve, reject) => {
  reject(new Error('p2_негайне_відхилення'));
});

Promise.all([
  p1.catch(error => { return error }),
  p2.catch(error => { return error }),
]).then(values => {
  console.log(values[0]) // "p1_відкладене_вирішення"
  console.error(values[1]) // "Error: p2_негайне_відхилення"
})

Специфікації

Специфікація
{{SpecName('ESDraft', '#sec-promise.all', 'Promise.all')}}

Сумісність з веб-переглядачами

{{Compat("javascript.builtins.Promise.all")}}

Див. також