Résultat d'une promesse
Objectif
Exploiter le résultat d'une promesse
Mise en situation
Nous savons désormais que l'on instancie une promesse avec l'objet Promise
et que l'on gère la mise à jour de son état avec les méthodes resolve
et reject
.
Nous allons désormais pouvoir aborder de façon plus détaillée l'utilisation de cet objet dans le code. Comment déclencher le traitement de la promesse et comment traiter les retours de celle-ci quand la méthode resolve
ou reject
est appelée ?
Méthode : Gérer les callbacks avec .then()
L'objet Promise
est un objet qui représente le succès ou l'échec d'une opération asynchrone.
À ces états, il va falloir attacher des comportements, des callbacks
. C'est grâce à la méthode .then()
de l'objet Promise
qu'il sera possible d'effectuer cette liaison.
const scrutin = new Promise(function (resolve, reject) {
// On récupère le % du résultat de l'élection pour le candidat 1
var resultat = getResultatDuScrutin("Candidat1");
if(resultat > .50){
resolve("Candidat 1 est élu");
} else {
reject("Candidat 1 a perdu");
}
}
);
scrutin.then(
(result) => console.log(result),
(error) => console.log(error)
);
/*
Si getResultatDuScrutin("Candidat1") == 0.3
//"Candidat 1 a perdu"
Si getResultatDuScrutin("Candidat1") == 0.6
//"Candidat 1 est élu"
*/
La méthode .then()
dispose de deux paramètres :
Le premier correspond à la fonction exécutée en cas de succès. Celle-ci disposera d'un paramètre, ici
result
, qui sera valorisé par l'argument transmis à la fonctionresolve
.Le second correspond à la fonction exécutée en cas d'échec. Celle-ci disposera d'un paramètre, ici
error
, qui sera valorisé par l'argument transmis à la fonctionreject
.
Une promesse ne pouvant pas changer d'état entre fulfilled
et rejected
, seule l'une des deux fonctions sera exécutée.
Méthode : Attraper les erreurs avec .catch()
Il est impératif d'indiquer quel comportement adopter en cas d'erreur : cela est rendu possible grâce à la méthode .catch()
.
Cette méthode sera déclenchée par l'état rejected
d'une Promise
.
var myPromise = new Promise((resolve, reject) => {
/*[...]*/
reject("Une erreur est survenue");
};
myPromise.catch((error) => console.log(error));
//Résultat :
//Une erreur est survenue
Méthode : Exécuter du code systématiquement avec .finally()
Il se peut que l'on veuille exécuter du code quel que soit le résultat de la Promise
, c'est-à-dire qu'elle soit fulfilled
ou rejected
.
Pour cela, il existe la méthode .finally()
. Cette méthode n'aura aucun paramètre et il sera impossible de savoir si la promesse est fulfilled
ou rejected
.
var myPromise = new Promise((resolve, reject) => {
if(/*[...]*/)
resolve("C'est un succès");
else {
reject("Une erreur est survenue");
}
};
myPromise.finally(() => console.log("Toujours executée"));
//Résultat :
//Toujours exécutée
Méthode : Enchaîner les méthodes
L'utilisation des méthodes .then()
, .catch()
et .finally()
n'est pas exclusif. Ces méthodes peuvent être chaînées.
var myPromise = new Promise((resolve, reject) => {
if(myAsyncFunction()) //Fonction asynchrone retournant un booléen
resolve("C'est un succès");
else {
reject("Une erreur est survenue");
}
};
myPromise
.then((result) => console.log(result))
.catch((error) => console.log(error))
.finally(() => console.log("Toujours executée"));
//Si myAsyncFunction() === true
//Résultat:
//C'est un succès
//Toujours executée
//Si myAsyncFunction() === false
//Résultat:
//Une erreur est survenue
//Toujours executée
Complément : Fonctionner de façon asynchrone
Une autre manière de résoudre les problèmes asynchrones est l'utilisation des mots-clés async
et await
.
Nous allons pouvoir placer le mot clé async devant une déclaration de fonction (ou une expression de fonction, ou encore une fonction fléchée) pour la transformer en fonction asynchrone.
Utiliser le mot clé async devant une fonction va faire que la fonction en question va toujours retourner une promesse. Dans le cas où la fonction retourne explicitement une valeur qui n'est pas une promesse, alors cette valeur sera automatiquement enveloppée dans une promesse.
Le mot clé await est uniquement valide au seil de fonctions asynchrones définies avec async.
Ce mot clé permet d'interrompre l'exécution d'une fonction asynchrone tant qu'une promesse n'est pas résolue ou rejetée. La fonction asynchrone reprend ensuite puis renvoie la valeur de résolution.
<code>
async function test(){
const promise = new Promise((resolve, reject) => {
setTimeout(() => resolve('On m’attend avant de continuer!'), 2000)
});
let result = await promise; //Attend que la promesse soit résolue ou rejetée
alert(result);
}
test();
</code>
Exemple : Utiliser la méthode then()
const getResultatDuScrutin2 = async (candidat) => {
// appel asynchrone (requête serveur par exemple)
}
// La promesse de la fonction scrutin() est remplacée par async
const scrutin = async () => {
// await indique que l'on attendra le resultat de getResultatDuScrutin2() pour retourner le resultat
return resultat = await getResultatDuScrutin2("Candidat1");
}
scrutin().then(
(resultat => {
if(resultat > .50){
console.log("Candidat 1 est élu");
} else {
console.log("Candidat 1 a perdu");
}
})
)
Syntaxe : À retenir
La méthode
.then()
de l'objetPromise
permet de récupérer le résultat d'une promesse, qu'elle soitfulfilled
ourejected
.La méthode
.catch()
permettra de traiter les échecs.Enfin, la méthode
.finally()
permettra d’exécuter du code à la suite d'une promesse, sans en connaître le résultat.