Premiers pas avec les promesses JavaScript
Le code asynchrone est utile pour effectuer des tâches qui prennent du temps mais, bien sûr, ce n'est pas sans inconvénients . Le code asynchrone utilise des fonctions de rappel pour traiter ses résultats, mais les fonctions de rappel ne peuvent pas renvoyer des valeurs que les fonctions JavaScript typiques peuvent traiter.
Ainsi, non seulement ils suppriment notre capacité à contrôler l' exécution de la fonction, mais ils rendent également la gestion des erreurs un peu compliquée. C'est là que l' objet Promise
entre en jeu, car il vise à combler certains des nids de poule en codage asynchrone .
Promise
est techniquement un objet interne standard en JavaScript, ce qui signifie qu'il est intégré à JavaScript . Il est utilisé pour représenter le résultat final d'un bloc de code asynchrone (ou la raison pour laquelle le code a échoué) et dispose de méthodes pour contrôler l' exécution du code asynchrone .
Syntaxe
Nous pouvons créer une instance de l'objet Promise
utilisant le new
mot-clé:
nouvelle promesse (function (resolve, reject) {});
La fonction transmise en tant que paramètre au constructeur Promise()
est appelée exécuteur . Il contient le code asynchrone et possède deux paramètres du type Function
, appelés fonctions de resolve
et de reject
(plus d'informations à ce sujet sous peu).
L'objet States of the Promise
L' état initial d'un objet Promise
est appelé en attente . Dans cet état, le résultat du calcul asynchrone n'existe pas .
L'état initial en attente passe à l'état satisfait lorsque le calcul est réussi . Le résultat du calcul est disponible dans cet état.
En cas d' échec du calcul asynchrone, l'objet Promise
passe à l'état rejeté à partir de son état initial en attente . Dans cet état, la raison de l'échec de calcul (c'est-à-dire un message d'erreur) est rendue disponible.
Pour passer de l'état en attente à l'état satisfait, la fonction resolve()
est appelée . Pour passer de l'état en attente à l'état rejeté, reject()
est appelé .
then
et catch
Lorsque l'état passe de pending à completed, le gestionnaire d'événements de la méthode then
de l'objet Promise
est exécuté. Et, lorsque l'état passe de pending à rejeté, le gestionnaire d'événements de la méthode catch
de l'objet Promise
est exécuté.
Exemple 1
Code "Non-Promisifié"
Supposons qu'il existe un fichier hello.txt
contenant le mot "Hello". Voici comment nous pouvons écrire une requête AJAX pour récupérer ce fichier et afficher son contenu, sans utiliser l'objet Promise
:
function getTxt () {let xhr = nouveau XMLHttpRequest (); xhr.open ('GET', 'bonjour.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () {try {switch (this.status) {cas 200: document.write (this.réponse); Pause; case 404: lancer 'Fichier non trouvé'; par défaut: throw 'Echec de récupération du fichier'; }} catch (err) {console.log (err)}}; } getTxt ();
Si le contenu du fichier a été récupéré avec succès, c'est-à - dire que le code d'état de la réponse est 200, le texte de la réponse est écrit dans le document . Si le fichier est introuvable (état 404), un message d'erreur «Fichier introuvable» est généré. Sinon, un message d'erreur général indiquant l'échec de l'extraction du fichier est renvoyé.
Code "Promisified"
Maintenant, promenons le code ci-dessus :
function getTxt () {return new Promise (fonction (résoudre, rejeter) {let xhr = nouvelle XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () {switch (this.status) {cas 200: résolution (this.response); cas 404: reject ('Fichier non trouvé'); défaut: reject ('Echec de récupère le fichier ');}};}); } getTxt (). then (fonction (txt) {document.write (txt);}). catch (fonction (err) {console.log (err);});
La fonction getTxt()
est maintenant codée pour renvoyer une nouvelle instance de l'objet Promise
, et sa fonction d'exécuteur contient le code asynchrone d'avant.
Lorsque le code d'état de réponse est 200, la Promise
est satisfaite en appelant resolve()
(la réponse est transmise en tant que paramètre de resolve()
). Lorsque le code d'état est 404 ou un autre, la Promise
est rejetée en utilisant reject()
(avec le message d'erreur approprié en tant que paramètre de reject()
).
Les gestionnaires d'événements pour les méthodes then()
et catch()
de l'objet Promise
sont ajoutés à la fin .
Lorsque la Promise
est remplie, le gestionnaire de la méthode then()
est exécuté. Son argument est le paramètre passé de resolve()
. Dans le gestionnaire d'événements, le texte de la réponse (reçu en tant qu'argument) est écrit dans le document .
Lorsque la Promise
est rejetée, le gestionnaire d'événements de la méthode catch()
est exécuté, enregistrant l'erreur .
Le principal avantage de la version promisifiée ci-dessus du code est la gestion des erreurs . Au lieu de jeter des exceptions non interceptées - comme dans la version non promis - les messages d'échec appropriés sont renvoyés et consignés.
Mais, ce n'est pas seulement le retour des messages d'échec mais aussi le résultat du calcul asynchrone qui peut être vraiment avantageux pour nous. Pour voir cela, nous devrons développer notre exemple.
Exemple 2
Code "Non-Promisifié"
Au lieu de simplement afficher le texte de hello.txt
, je veux le combiner avec le mot "World" et l'afficher sur l'écran après un délai de 2 secondes . Voici le code que j'utilise:
function getTxt () {let xhr = nouveau XMLHttpRequest (); xhr.open ('GET', 'bonjour.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () {try {switch (this.status) {cas 200: document.write (concatTxt (this.réponse)); Pause; case 404: lancer 'Fichier non trouvé'; par défaut: throw 'Echec de récupération du fichier'; }} catch (err) {console.log (err)}}; } function concatTxt (res) {setTimeout (fonction () {return (res + 'Monde')}, 2000); } getTxt ();
Sur le code d'état 200, la fonction concatTxt()
est appelée pour concaténer le texte de la réponse avec le mot "World" avant de l'écrire dans le document.
Mais, ce code ne fonctionnera pas comme souhaité . La fonction de rappel setTimeout()
ne peut pas renvoyer la chaîne concaténée . Ce qui sera imprimé dans le document n'est undefined
car c'est ce que concatTxt()
renvoie .
Code "Promisified"
Donc, pour que le code fonctionne, promettons le code ci-dessus, y compris concatTxt()
:
function getTxt () {return new Promise (fonction (résoudre, rejeter) {let xhr = nouvelle XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () {switch (this.status) {cas 200: résolution (this.response); cas 404: reject ('Fichier non trouvé'); défaut: reject ('Echec de récupère le fichier ');}};}); } function concatTxt (txt) {return new Promise (fonction (résoudre, rejeter) {setTimeout (function () {resolve (txt + 'Monde');}, 2000);}); } getTxt (). then ((txt) => {return concatTxt (txt);}). then ((txt) => {document.write (txt);}). catch ((err) => {console. log (err);});
Tout comme getTxt()
, la fonction concatTxt()
renvoie également un nouvel objet Promise
au lieu du texte concaténé. La Promise
retournée par concatTxt()
est résolue dans la fonction de callback de setTimeout()
.
Près de la fin du code ci-dessus, le gestionnaire d'événements de la première méthode then()
s'exécute lorsque la Promise
de getTxt()
est remplie, c'est-à-dire lorsque le fichier est récupéré avec succès . Dans ce gestionnaire, concatTxt()
est appelé et la Promise
retournée par concatTxt()
est renvoyée .
Le gestionnaire d'événements de la seconde méthode then()
s'exécute lorsque la Promise
retournée par concatTxt()
est remplie, c'est-à-dire que le délai de deux secondes est terminé et que resolve()
est appelée avec la chaîne concaténée comme paramètre.
Enfin, catch()
récupère toutes les exceptions et les messages d'échec des deux promesses.
Dans cette version Promise, la chaîne "Hello World" sera imprimée avec succès dans le document.
Instagram vous permet désormais de mettre en signet des posts
Instagram a récemment publié de nouvelles fonctionnalités sur un rouleau, et voici une autre mise à jour agréable: publier des posts.Disponible sur Instagram version 10.2, vous verrez une icône de marque-page sous les articles du flux. En appuyant dessus, le message sera enregistré dans un dossier "Saved", visible uniquement par le propriétaire . Tous l
10 Podcasts Tous les développeurs Web doivent s'abonner à
Si vous vous déplacez sur de longues distances pour étudier ou travailler, il existe de nombreuses façons de tirer le meilleur parti de ce temps de déplacement. Par exemple, vous pouvez écouter des livres audio ou vous abonner à des podcasts pour écouter dans le bus ou le train. Bien qu'il y ait beaucoup de podcasts à découvrir, nous pensons que vous voudrez peut-être commencer tout de suite, alors nous avons fait la recherche pour vous.Voici 10