Promise.all în JavaScript

Cod asincron ES2015 (ES6)

Așteaptă mai multe promisiuni în paralel și returnează toate rezultatele, în ordine; eșuează la prima eroare.

Sintaxă
const rezultate = await Promise.all([promisiune1, promisiune2, ...]);

Ce face Promise.all

Promise.all pornește de la un tablou (sau alt iterabil) de promisiuni și returnează o promisiune nouă. Aceasta primește tabloul rezultatelor, în aceeași ordine ca promisiunile, indiferent care s-a terminat prima.

Dacă oricare promisiune este respinsă, Promise.all este respinsă imediat cu acea eroare, iar celelalte rezultate se pierd (cererile pornite continuă totuși în fundal). Când vrei toate rezultatele, inclusiv eșecurile, folosește Promise.allSettled.

Valorile din tablou care nu sunt promisiuni sunt tratate ca promisiuni deja împlinite. Un tablou gol dă imediat [].

Parametri

Parametru Descriere
promisiuni Un iterabil cu promisiuni sau valori.

Ce returnează

O Promise cu tabloul rezultatelor.

Exemple

Exemplul 1: În paralel, rezultatele în ordine

const pauza = (ms, valoare) => new Promise((resolve) => setTimeout(() => resolve(valoare), ms));

const inceput = Date.now();
const [utilizator, comenzi, setari] = await Promise.all([
  pauza(300, "Ana"),
  pauza(100, ["#101", "#102"]),
  pauza(200, { tema: "întunecată" }),
]);

console.log(utilizator, comenzi, setari);
console.log(Date.now() - inceput < 450 ? "durata ≈ cea mai lungă promisiune" : "pe rând");

Rezultat

Ana [ '#101', '#102' ] { tema: 'întunecată' }
durata ≈ cea mai lungă promisiune

Exemplul 2: O singură eroare oprește tot

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

try {
  await Promise.all([pauza(100, "ok"), esec(50, "Serverul de stoc nu răspunde"), pauza(200, "ok")]);
} catch (e) {
  console.log("Eroare:", e.message);
}

Rezultat

Eroare: Serverul de stoc nu răspunde

Exemplul 3: Cu fetch, pentru mai multe adrese

const adrese = ["/api/produse", "/api/categorii"];
const [produse, categorii] = await Promise.all(adrese.map((a) => fetch(a).then((r) => r.json())));

console.log(produse.length, categorii.length);

Rezultat posibil (depinde de răspunsul serverului)

24 6

Greșeli frecvente

  • Scrii await pe rând pentru operații independente (const a = await f(); const b = await g();). Durează suma timpilor; cu Promise.all durează cât cea mai lentă.
  • Folosești Promise.all când unele eșecuri sunt acceptabile și pierzi toate rezultatele bune. Folosește Promise.allSettled.

Comenzi înrudite

  • Promise.allSettled: Așteaptă toate promisiunile, reușite sau eșuate, și returnează starea fiecăreia.
  • Promise.race: Returnează rezultatul (sau eroarea) primei promisiuni care se termină.
  • async / await: Scrie cod asincron care se citește ca un cod obișnuit, de sus în jos.