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 Latest Draft (ECMA-262)
The definition of 'Promise.race' in that specification.

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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
race()Chrome Full support 32Edge Full support 12Firefox Full support 29IE No support NoOpera Full support 19Safari Full support 8WebView Android Full support 4.4.3Chrome Android Full support 32Firefox Android Full support 29Opera Android Full support 19Safari iOS Full support 8Samsung Internet Android Full support 2.0nodejs Full support 0.12

Legend

Full support  
Full support
No support  
No support

Див. також