JavaScriptCode asynchrone

Promise.any()

Renvoie le résultat de la première promesse résolue. Ne se rejette que si toutes échouent.

Renvoie
Une promesse résolue avec la valeur de la première promesse réussie, ou rejetée avec une erreur AggregateError.
Sur cette page

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))

const source = await Promise.any([
  fail(100, 'Le serveur A est hors service'),
  wait(300, 'Serveur B'),
  wait(200, 'Serveur C')
])

console.log(`Données de : ${source}`)
Console
Données de : Serveur C

Définition et utilisation

#

La méthode Promise.any() attend le premier succès. Les erreurs des promesses individuelles sont ignorées tant qu’il en reste au moins une susceptible de se résoudre. C’est ce qui la distingue de Promise.race(), où une première erreur peut aussi gagner.

Si toutes les promesses sont rejetées, Promise.any() se rejette avec une erreur AggregateError. Elle possède un champ errors contenant un tableau de toutes les raisons de rejet, dans l’ordre des promesses passées.

Un usage typique consiste à récupérer la même ressource depuis plusieurs sources, par exemple des serveurs de secours, et à utiliser celle qui répond correctement en premier.

Syntaxe

#
Syntaxe
Promise.any(iterable)

Paramètres

#
  • iterable

    tableau de promesses

    Les promesses parmi lesquelles seul le premier succès compte.

Plus d’exemples

#
Toutes les promesses rejetées
JavaScript
try {
  await Promise.any([
    Promise.reject(new Error('Pas de réseau')),
    Promise.reject(new Error('Serveur en maintenance'))
  ])
} catch (error) {
  console.log(error.name)
  console.log(error.errors.map((e) => e.message))
}
Console
AggregateError
['Pas de réseau', 'Serveur en maintenance']
Comparaison avec Promise.race()
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))

const tasks = () => [fail(100, 'Erreur rapide'), wait(200, 'Succès plus lent')]

console.log(await Promise.any(tasks()))

try {
  await Promise.race(tasks())
} catch (error) {
  console.log(error.message)
}
Console
Succès plus lent
Erreur rapide

Compatibilité des navigateurs

#

Largement disponible · depuis 2020

Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.

  • Chrome
  • Edge
  • Firefox
  • Safari

Bonnes pratiques

#
  • En gérant une erreur de Promise.any(), regardez du côté de error.errors. Vous y trouverez les causes de tous les échecs.
  • Quand seul le premier résultat compte, qu’il s’agisse d’un succès ou d’une erreur, utilisez Promise.race().

Entrées associées

#

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