Passer au contenu principal
eLearner.app
Module 7 · Leçon 1 sur 425/32 dans le cours~12 min
Leçons du module (1/4)

Promesses : ce qu'elles sont

Une Promise est une valeur qui représente le résultat d'une opération qui se terminera dans le futur. Elle peut être dans trois états :

  • pending — l'opération est encore en cours
  • fulfilled — elle s'est terminée avec succès, il y a une valeur
  • rejected — elle a échoué, il y a une erreur

Une fois qu'elle sort de l'état pending, elle est « fixée » pour toujours.

Créer une Promise résolue

Les deux manières les plus courantes (vous ne créerez presque jamais de Promise « à la main » avec le constructeur) :

JS
const p1 = Promise.resolve(42);
const p2 = Promise.reject(new Error('oops'));

Lire le résultat : .then / .catch

JS
Promise.resolve(10).then((v) => {
  console.log(v); // 10
});

Promise.reject(new Error('no')).catch((e) => {
  console.log(e.message); // 'no'
});

.then reçoit une fonction qui est appelée avec la valeur résolue. .catch reçoit une fonction appelée avec l'erreur en cas de rejet.

Enchaîner

Chaque .then renvoie à son tour une Promise : vous pouvez les enchaîner pour transformer la valeur étape par étape.

JS
Promise.resolve(5)
  .then((n) => n * 2)
  .then((n) => n + 1)
  .then((n) => console.log(n)); // 11

Si l'un des .then lève une exception (ou renvoie une Promise qui échoue), l'exécution passe directement au premier .catch suivant.

Constructeur (rare)

JS
const p = new Promise((resolve, reject) => {
  if (Math.random() > 0.5) resolve('ok');
  else reject(new Error('no'));
});

Vous ne l'utiliserez que lorsque vous devrez « promisifier » quelque chose qui utilise des callbacks (par exemple, d'anciennes API DOM ou setTimeout).

À vous de jouer

Exercice#js.m7.l1.e1
Tentatives : 0Chargement…

Définissez `promisedVersion(n)` qui, à partir d'un nombre, retourne une Promise résolue avec le double de n.

Chargement de l'éditeur…
Afficher l'indice

return Promise.resolve(n * 2)

Solution disponible après 3 tentatives

Exercice de révision

Exercice#js.m7.l1.e2
Tentatives : 0Chargement…

Définissez `incrementThree(p)` qui reçoit une Promise contenant un nombre et retourne une Promise contenant ce nombre + 3. Utilisez une chaîne .then.

Chargement de l'éditeur…
Afficher l'indice

p.then((n) => n + 3)

Solution disponible après 3 tentatives