JavaScriptCode asynchrone

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.

Renvoie
Une promesse avec le résultat ou l’erreur de la première promesse réglée.
Sur cette page

Exemple

#
JavaScript
const wait = (ms, value) => new Promise((resolve) => setTimeout(() => resolve(value), ms))

const winner = await Promise.race([wait(300, 'Lucas'), wait(100, 'Léa'), wait(200, 'Emma')])

console.log(`Première réponse : ${winner}`)
Console
Première réponse : Léa

Définition et utilisation

#

La méthode Promise.race() organise une course entre des promesses. La promesse renvoyée prend le résultat de celle qui se règle en premier, que ce soit un succès ou une erreur. Les autres promesses continuent de s’exécuter, mais leurs résultats sont ignorés.

L’usage le plus courant est un délai d’expiration. Vous faites courir l’opération réelle contre une promesse qui se rejette au bout de quelques secondes. Si l’opération n’a pas fini à temps, vous obtenez une erreur de délai dépassé au lieu d’attendre indéfiniment.

Un tableau vide donne une promesse qui ne se règle jamais. Si seul le premier succès vous intéresse et que les erreurs doivent être ignorées, utilisez Promise.any().

Syntaxe

#
Syntaxe
Promise.race(iterable)

Paramètres

#
  • iterable

    tableau de promesses

    Les promesses qui participent à la course.

Plus d’exemples

#
Délai d’expiration pour une opération
JavaScript
const wait = (ms, value) => new Promise((resolve) => setTimeout(() => resolve(value), ms))
const timeout = (ms) =>
  new Promise((_, reject) => setTimeout(() => reject(new Error('Délai dépassé')), ms))

try {
  const data = await Promise.race([wait(800, 'données du serveur'), timeout(300)])
  console.log(data)
} catch (error) {
  console.log(error.message)
}
Console
Délai dépassé

Compatibilité des navigateurs

#

Largement disponible

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

  • Chrome
  • Edge
  • Firefox
  • Safari

Bonnes pratiques

#
  • Pour un délai d’expiration sur les requêtes fetch(), il est plus pratique d’utiliser l’option signal: AbortSignal.timeout(ms), qui interrompt en plus la requête elle-même.
  • N’oubliez pas que les promesses perdantes ne sont pas annulées. Leurs opérations, par exemple des requêtes vers un serveur, continuent de s’exécuter.

Entrées associées

#

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