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
awaitpe rând pentru operații independente (const a = await f(); const b = await g();). Durează suma timpilor; cuPromise.alldurează cât cea mai lentă. - Folosești
Promise.allcând unele eșecuri sunt acceptabile și pierzi toate rezultatele bune. FoloseștePromise.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.