Promise.race()
Метод Promise.race()
повертає проміс, який виконується чи відхиляється, як тільки один з промісів ітерабельного об'єкта буде виконаний чи відхилений, зі значеням або причиною з цього проміса.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Початковий код до цього інтерактивного демо зберігаєтся в GitHub репозиторії. Якщо ви хочете внести свій вклад до проекту цього інтерактивного демо, будь ласка, клонуйте https://github.com/mdn/interactive-examples і надішліть нам запит на злиття.
Синтаксис
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 швидший, тому він відхиляється
});
Специфікації
Сумісність з веб-переглядачами
BCD tables only load in the browser
The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.