Introduction aux promesses en JavaScript
Vous savez déjà que l'utilisation du modèle de rappels (callbacks) pour l'asynchronisme mène facilement à une situation appelée callback hell. C'est pourquoi un nouveau modèle appelé promesses (promise) a été introduit en JavaScript. Étudions ce modèle.
Une promesse représente un objet, dans lequel une fonction est passée en paramètre, et à l'intérieur de laquelle nous devons placer notre code asynchrone :
let promise = new Promise(function() {
// code asynchrone
});
Comme vous le voyez, j'ai enregistré l'objet de promesse
dans la variable promise. À un autre endroit
du code, je peux appliquer à cette variable la méthode
then, en lui passant une fonction
contenant le code qui doit être exécuté une fois
le code asynchrone, écrit lors de la création de cette promesse, terminé :
promise.then(function() {
// s'exécutera à la fin du code asynchrone
});
Cela semble déroutant, alors regardons un exemple. Supposons que j'aie le code asynchrone suivant :
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
Supposons que je veuille résoudre pour lui notre tâche principale
de l'asynchronisme : exécuter un certain
code après le déclenchement du minuteur. En même temps,
je ne veux pas placer ce code dans le minuteur lui-même
et je veux que le résultat,
écrit par moi dans la variable result, parvienne d'une manière ou d'une autre à ce code.
En somme, nous avons résolu cette tâche dans les leçons précédentes
via des rappels et des abonnements. Regardons
maintenant comment le faire via les promesses.
Pour commencer, nous devons envelopper notre code asynchrone dans une promesse :
let promise = new Promise(function() {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
Cependant, cela ne suffit pas. Nous devons indiquer explicitement que notre code asynchrone est terminé. Une fonction de résolution spéciale nous y aidera, passée automatiquement dans le premier paramètre de la fonction, si celui-ci est spécifié :
let promise = new Promise(function(resolve) { // nous indiquons le paramètre
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
À l'aide de la fonction de résolution, nous pouvons explicitement indiquer à la promesse que le code asynchrone est terminé. Pour cela, nous devons appeler cette fonction à l'endroit où nous en avons besoin :
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(); // nous terminons la promesse
}, 3000);
});
En même temps, si nous voulons transmettre à l'extérieur un certain résultat du code asynchrone, nous pouvons le passer en paramètre à notre fonction de résolution :
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(result); // nous transmettons le résultat
}, 3000);
});
Nous pouvons, bien sûr, nous débarrasser de la variable intermédiaire :
let promise = new Promise(function(resolve) {
setTimeout(function() {
resolve([1, 2, 3, 4, 5]);
}, 3000);
});
Maintenant, n'importe où ailleurs, nous pouvons appeler
la méthode then de notre promesse :
promise.then(function() {
// se déclenchera à la fin de la promesse
});
Le résultat de la promesse arrivera dans le premier paramètre de la fonction, si nous souhaitons le spécifier :
promise.then(function(result) {
console.log(result); // affichera le tableau avec le résultat
});
Créez une promesse, à l'intérieur de laquelle il y aura un délai
de 5 secondes, après laquelle la promesse doit
s'exécuter, en retournant comme résultat un texte quelconque.
Affichez ce texte à l'écran.