Promise.race()

Метод Promise.race() повертає проміс, який виконується чи відхиляється, як тільки один з промісів ітерабельного об'єкта буде виконаний чи відхилений, зі значеням або причиною з цього проміса.

Синтаксис

Promise.race(iterable);

Параметри

iterable
Ітерабельний об'єкт, наприклад, Array. Дивіться ітерабельний об'єкт.

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

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

Опис

Функція race повертає об'єкт Promise, який встановлюється таким самим чином (і отримує таке ж значення), як і перший встановлений проміс ітерабельного об'єкта, переданого як аргумент.

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

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

Приклади

Асинхронність Promise.race

Цей приклад демострує асинхронність функції Promise.race:

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

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

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

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

Пустий ітерабельний об'єкт спричиняє поверення проміса, який вічно знаходитиметься в стані очікування:

var foreverPendingPromise = Promise.race([]);
console.log(foreverPendingPromise);
setTimeout(function(){
    console.log('тепер стек порожній');
    console.log(foreverPendingPromise);
});

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

Якщо ітерабельний об'єкт містить одне або більше значень, що не є промісами, та/або вже встановлені проміси, тоді Promise.race  буде вирішено з першим таким значенням, знайденим у масиві:

var foreverPendingPromise = Promise.race([]);
var alreadyResolvedProm = Promise.resolve(666);

var arr = [foreverPendingPromise, alreadyResolvedProm, "не проміс"];
var arr2 = [foreverPendingPromise, "не проміс", Promise.resolve(666)];
var p = Promise.race(arr);
var p2 = Promise.race(arr2);

console.log(p);
console.log(p2);
setTimeout(function(){
    console.log('тепер стек порожній');
    console.log(p);
    console.log(p2);
});

// порядок виведення:
// Promise { <state>: "pending" }
// Promise { <state>: "pending" }
// тепер стек порожній
// Promise { <state>: "fulfilled", <value>: 666 }
// Promise { <state>: "fulfilled", <value>: "не проміс" }

Використання Promise.race – приклади з setTimeout

var p1 = new Promise(function(resolve, reject) {
    setTimeout(() => resolve('один'), 500);
});
var p2 = new Promise(function(resolve, reject) {
    setTimeout(() => resolve('два'), 100);
});

Promise.race([p1, p2])
.then(function(value) {
  console.log(value); // "два"
  // Обидва вирішуються, але p2 швидший
});

var p3 = new Promise(function(resolve, reject) {
    setTimeout(() => resolve('три'), 100);
});
var p4 = new Promise(function(resolve, reject) {
    setTimeout(() => reject(new Error('чотири')), 500);
});

Promise.race([p3, p4])
.then(function(value) {
  console.log(value); // "три"
  // p3 швидший, тому він виконується
}, function(reason) {
  // Не викликається
});

var p5 = new Promise(function(resolve, reject) {
    setTimeout(() => resolve("п'ять"), 500);
});
var p6 = new Promise(function(resolve, reject) {
    setTimeout(() => reject(new Error('шість')), 100);
});

Promise.race([p5, p6])
.then(function(value) {
  // Не викликається
}, function(reason) {
  console.log(reason); // "шість"
  // p6 швидший, тому він відхиляється
});

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

Специфікація
ECMAScript (ECMA-262)
The definition of 'Promise.race' in that specification.

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

BCD tables only load in the browser

Див. також