From 218934fa2ed1c702a6d3923d2aa2cc6b43c48684 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:43:23 -0500 Subject: initial commit --- .../global_objects/promise/all/index.html | 232 +++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 files/uk/web/javascript/reference/global_objects/promise/all/index.html (limited to 'files/uk/web/javascript/reference/global_objects/promise/all') diff --git a/files/uk/web/javascript/reference/global_objects/promise/all/index.html b/files/uk/web/javascript/reference/global_objects/promise/all/index.html new file mode 100644 index 0000000000..156b5f499f --- /dev/null +++ b/files/uk/web/javascript/reference/global_objects/promise/all/index.html @@ -0,0 +1,232 @@ +--- +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")}}

+ +

Див. також

+ + -- cgit v1.2.3-54-g00ecf