Promise.any în JavaScript

Cod asincron ES2021

Returnează rezultatul primei promisiuni reușite; eșuează doar dacă toate eșuează.

Sintaxă
const primul = await Promise.any([promisiune1, promisiune2, ...]);

Ce face Promise.any

Promise.any ignoră erorile cât timp mai există o șansă de reușită și se împlinește cu prima valoare obținută. Este util când ai mai multe surse pentru aceleași date (servere de rezervă, oglinzi).

Dacă toate promisiunile sunt respinse, aruncă un AggregateError, care are în proprietatea errors toate erorile, în ordine.

Parametri

Parametru Descriere
promisiuni Un iterabil cu promisiuni.

Ce returnează

O Promise cu prima valoare reușită.

Exemple

Exemplul 1: Primul server care răspunde corect

const pauza = (ms, valoare) => new Promise((resolve) => setTimeout(() => resolve(valoare), ms));
const esec = (ms, mesaj) => new Promise((_, reject) => setTimeout(() => reject(new Error(mesaj)), ms));

const raspuns = await Promise.any([
  esec(50, "server 1 căzut"),
  pauza(200, "date de la server 2"),
  pauza(120, "date de la server 3"),
]);
console.log(raspuns);

Rezultat

date de la server 3

Exemplul 2: Toate au eșuat

const esec = (ms, mesaj) => new Promise((_, reject) => setTimeout(() => reject(new Error(mesaj)), ms));

try {
  await Promise.any([esec(30, "A"), esec(10, "B")]);
} catch (e) {
  console.log(e.constructor.name, e.errors.map((x) => x.message));
}

Rezultat

AggregateError [ 'A', 'B' ]

Greșeli frecvente

  • Confunzi Promise.any cu Promise.race. race se oprește la primul rezultat, chiar dacă este o eroare; any așteaptă primul succes.

Comenzi înrudite

  • Promise.race: Returnează rezultatul (sau eroarea) primei promisiuni care se termină.
  • Promise.all: Așteaptă mai multe promisiuni în paralel și returnează toate rezultatele, în ordine; eșuează la prima eroare.
  • Promise.allSettled: Așteaptă toate promisiunile, reușite sau eșuate, și returnează starea fiecăreia.