Promise.all / allSettled / race / any
JavaScript 🟡 MidDéfinition
Combinateurs statiques de Promise : all (toutes réussies ou premier échec), allSettled (toutes terminées), race (première terminée), any (première réussie). Deux ajouts récents : Promise.withResolvers (ES2024) qui renvoie {promise, résolve, reject}, et Promise.try (ES2025) qui exécute une fonction synchrone ou asynchrone en capturant ses exceptions dans une promesse.
Analogie
all = tous les invites doivent arriver pour manger. race = on mange des que le premier arrive. any = on mange des qu'un invite avec le dessert arrive. allSettled = on attend que tout le monde ait répondu, oui ou non.
Exemple de code
const [a, b] = await Promise.all([fetchA(), fetchB()]);
const etats = await Promise.allSettled([p1, p2]);
const rapide = await Promise.race([p1, timeout(500)]);
const premier = await Promise.any([p1, p2]);
// ES2024 : résolveurs externes
const { promise, resolve } = Promise.withResolvers();
// ES2025 : capture aussi les throw synchrones
await Promise.try(() => JSON.parse(texte)).catch(console.error);
Cas d'usage
Paralleliser des appels API indépendants (all), tolérant aux échecs (allSettled), timeout (race).
Anti-pattern
Termes liés
En entretien
Quelle différence entre Promise.all, allSettled, race et any ?
all attend que toutes réussissent ou s'arrête au premier échec ; allSettled attend que toutes soient terminées, réussies ou non ; race renvoie la première terminée peu importe le résultat ; any renvoie la première réussie. On choisit all pour paralléliser des appels indépendants, allSettled pour tolérer les échecs, race pour un timeout.
Quel anti-pattern voit-on souvent avec des appels API indépendants ?
Utiliser await en série sur des opérations qui ne dépendent pas les unes des autres, ce qui les exécute inutilement l'une après l'autre. Promise.all permet de les paralléliser.
À quoi sert Promise.try, ajouté par ES2025 ?
Il exécute une fonction, synchrone ou asynchrone, en capturant systématiquement ses exceptions dans une promesse. Cela évite d'avoir deux chemins de gestion d'erreur selon que la fonction est sync ou async.
Sources
Fiche mise à jour le 2026-09-27