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 :
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 :
(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