ComparaisonComparaisons

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.

Sur cette page

Comparaison point par point

#

Exemple

#
JavaScript
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))
Console
Promise.all: Erreur des cours
Promise.allSettled: ['fulfilled', 'rejected']

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

#
Syntaxe
Promise.all(iterable)
Promise.allSettled(iterable)

Plus d’exemples

#
Forme des résultats de allSettled() contre l’erreur de all()
JavaScript
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)
}
Console
[{ status: 'fulfilled', value: 'OK' }, { status: 'rejected', reason: Error: Oups }]
Oups
Seuls les résultats réussis de allSettled()
JavaScript
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)
Console
['Ranking', 'Badges']

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 champ status de 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

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.