Skip to content

Les promesses

Qu'est-ce qu'une promesse (promise)

Promise (qui se prononce presque comme en français) est un objet qui est apparu dans la spécification de la version 6 d'ECMAScript, sortie en 2015 (ES6 ou ES2015). Les promesses ont été utilisées bien avant grâce à des polyfills, notamment Bluebird et Q. Je recommande d'utiliser les promesses natives, et éventuellement, mais rarement et dans des cas très particuliers, d'utiliser Bluebird.

Une promesse est un objet qui ne peut être que dans deux états :

  • en attente de résolution (pending)
  • acquittée (settled)

Si elle est acquittée, elle peut être dans deux sous-états :

  • tenue (fulfilled)
  • rompue (rejected)

Une fois acquittée, elle ne peut plus passer d'un état à un autre.

Utilisation des promesses

Une promesse est un objet sur lequel il y a 3 propriétés :

  • then
  • catch
  • finally (Existe depuis ES2018)

Toutes les 3 sont des fonctions.

Promise.prototype.then est une fonction qui prend une ou deux (je recommande de n'en utiliser qu'une) fonctions de rappel en paramètre : la première est exécutée en cas de promesse tenue avec un seul argument : la valeur résolue, la deuxième est exécutée en cas de promesse rompue, avec un seul argument : l'erreur levée.

Promise.prototype.catch() est une fonction qui prend une seule fonction en paramètre, et cette fonction ne recevra qu'un argument : l'erreur levée, et elle ne sera exécutée que si la promesse est rompue.

Promise.prototype.finally() est une fonction qui prend aussi une seule fonction en paramètre, à qui aucun argument ne sera passé, et elle sera exécutée dans tous les cas.

Ces trois méthodes renvoient des promesses, ce qui les rend chaînables :

js
functionAsynchrone()
  .then(val => val * 2) // Ne sera exécutée que si functionAsynchrone() retourne une promesse tenue
  .catch(err => console.error(err)) // Ne sera exécutée que si functionAsynchrone() OU .then(val => val * 2) retourne une promesse rompue
  .finally(() => fonctionPourNettoyer()) // Sera exécutée dans tous les cas

Les mots-clés async/await

Il est possible d’écrire le code précédent d’une autre façon, moins verbeuse :

js
(async function () {
  try {
    const val = await functionAsynchrone()
    return val * 2
  }
  catch (error) {
    console.error(error)
  }
  finally {
    fonctionPourNettoyer()
  }
}()) // Ceci est une IIFE (à prononcer "iffy") - Immediately Invoked Function Expression