Promise.allSettled în JavaScript

Cod asincron ES2020

Așteaptă toate promisiunile, reușite sau eșuate, și returnează starea fiecăreia.

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

Ce face Promise.allSettled

Spre deosebire de Promise.all, Promise.allSettled nu este niciodată respinsă. Așteaptă ca fiecare promisiune să se termine și returnează un tablou de obiecte: { status: "fulfilled", value } pentru cele reușite și { status: "rejected", reason } pentru cele eșuate.

Este potrivit când operațiile sunt independente și vrei să știi ce a mers și ce nu, de exemplu la trimiterea mai multor notificări.

Parametri

Parametru Descriere
promisiuni Un iterabil cu promisiuni sau valori.

Ce returnează

O Promise cu tabloul stărilor.

Exemple

Exemplul 1: Reușite și eșecuri

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 rezultate = await Promise.allSettled([
  pauza(100, "email trimis"),
  esec(50, "SMS eșuat"),
  pauza(80, "notificare trimisă"),
]);

console.log(rezultate.map((r) => r.status));
for (const r of rezultate) {
  console.log(r.status === "fulfilled" ? r.value : `Eroare: ${r.reason.message}`);
}

Rezultat

[ 'fulfilled', 'rejected', 'fulfilled' ]
email trimis
Eroare: SMS eșuat
notificare trimisă

Greșeli frecvente

  • Citești r.value fără să verifici r.status. Pentru promisiunile respinse, value nu există; eroarea este în reason.

Comenzi înrudite

  • Promise.all: Așteaptă mai multe promisiuni în paralel și returnează toate rezultatele, în ordine; eșuează la prima eroare.
  • Promise.any: Returnează rezultatul primei promisiuni reușite; eșuează doar dacă toate eșuează.
  • try / catch: Prinde erorile, ca programul să nu se oprească și să poți afișa un mesaj clar.