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) :
const p1 = Promise.resolve(42);
const p2 = Promise.reject(new Error('oops'));Lire le résultat : .then / .catch
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.
Promise.resolve(5)
.then((n) => n * 2)
.then((n) => n + 1)
.then((n) => console.log(n)); // 11Si 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)
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
Définissez `promisedVersion(n)` qui, à partir d'un nombre, retourne une Promise résolue avec le double de n.
Afficher l'indice
return Promise.resolve(n * 2)
Solution disponible après 3 tentatives
Exercice de révision
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.
Afficher l'indice
p.then((n) => n + 3)
Solution disponible après 3 tentatives