Promise. all() vs Promise. allSettled()
Promise.all() est rejetée dès la première erreur et renvoie un tableau de résultats, tandis que Promise.allSettled() attend chaque promesse et n’est jamais rejetée.
Comparaison point par point
#Ce qu’elle renvoie en cas de succès
- Promise.all()
- Un tableau de résultats dans l’ordre des promesses
- Promise.allSettled()
- Un tableau d’objets
{ status, value }ou{ status, reason }
Quand elle est rejetée
- Promise.all()
- Immédiatement à la première erreur
- Promise.allSettled()
- N’est jamais rejetée
Attend la résolution de chaque promesse
- Promise.all()
- Non, s’arrête à la première erreur
- Promise.allSettled()
- Oui, attend toujours toutes les promesses
Accès aux erreurs des promesses individuelles
- Promise.all()
- Seulement la première erreur, via
catch() - Promise.allSettled()
- Chaque erreur, dans le champ
reasonde son résultat
Tableau vide comme argument
- Promise.all()
- Se résout immédiatement avec un tableau
[] - Promise.allSettled()
- Se résout immédiatement avec un tableau
[]
Usage typique
- Promise.all()
- Opérations qui doivent toutes réussir
- Promise.allSettled()
- Opérations indépendantes, où l’erreur de l’une ne gêne pas les autres
Exemple
#const wait = (ms, value) => new Promise((resolve) => setTimeout(() => resolve(value), ms))
const fail = (ms, message) =>
new Promise((_, reject) => setTimeout(() => reject(new Error(message)), ms))
try {
await Promise.all([wait(100, 'profil'), fail(150, 'Erreur des cours')])
} catch (error) {
console.log('Promise.all:', error.message)
}
const settled = await Promise.allSettled([wait(100, 'profil'), fail(150, 'Erreur des cours')])
console.log('Promise.allSettled:', settled.map((r) => r.status))Définition et utilisation
#Les deux méthodes acceptent un tableau de promesses et permettent de lancer des opérations indépendantes en parallèle, plutôt que l’une après l’autre, donc elles durent ensemble aussi longtemps que la plus longue. Les deux renvoient les résultats dans l’ordre des promesses données, peu importe laquelle s’est résolue en premier.
Elles diffèrent par leur comportement en cas d’erreur. Promise.all() est rejetée immédiatement dès qu’une seule promesse est rejetée, et les résultats des autres sont perdus (les opérations elles-mêmes ne sont pas interrompues, seul leur résultat est ignoré). Promise.allSettled() n’est jamais rejetée : elle attend que chaque promesse soit résolue et renvoie un tableau d’objets { status, value } pour les succès et { status, reason } pour les erreurs.
Quand chaque opération doit réussir, et que l’erreur de l’une doit interrompre le tout, utilisez Promise.all(). Quand les opérations sont indépendantes les unes des autres et que vous voulez savoir lesquelles ont réussi, même si d’autres ont échoué, utilisez Promise.allSettled().
Syntaxe
#Promise.all(iterable)
Promise.allSettled(iterable)Plus d’exemples
#const results = await Promise.allSettled([Promise.resolve('OK'), Promise.reject(new Error('Oups'))])
console.log(results)
try {
await Promise.all([Promise.resolve('OK'), Promise.reject(new Error('Oups'))])
} catch (error) {
console.log(error.message)
}const results = await Promise.allSettled([
Promise.resolve('Ranking'),
Promise.reject(new Error('Chat indisponible')),
Promise.resolve('Badges')
])
const succeeded = results.filter((r) => r.status === 'fulfilled').map((r) => r.value)
console.log(succeeded)Bonnes pratiques
#- Combinez les deux méthodes avec
map()pour lancer la même opération sur plusieurs éléments à la fois, par ex.await Promise.allSettled(ids.map(loadUser)). - Après
Promise.allSettled(), vérifiez toujours le champstatusde chaque résultat. La méthode elle-même ne vous dira pas que quelque chose a échoué. - Quand seul le premier résultat compte, succès ou échec, aucune de ces deux méthodes n’est la bonne. Regardez
Promise.race().
Entrées associées
#- Promise.all()Attend que toutes les promesses soient résolues et renvoie un tableau de leurs résultats. Se rejette dès la première erreur.
- Promise.allSettled()Attend que toutes les promesses soient réglées et renvoie une description de chaque résultat, succès comme erreurs.
- Promise.race()Renvoie une promesse qui se règle de la même façon que la première promesse réglée de la liste : par un succès ou par une erreur.
- Promise.any()Renvoie le résultat de la première promesse résolue. Ne se rejette que si toutes échouent.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.