Page d'accueil » Codage » Débuter avec les promesses JavaScript

    Débuter avec les promesses JavaScript

    Code asynchrone est utile pour effectuer des tâches qui sont long mais bien sûr, c'est pas dépourvu. Le code asynchrone utilise fonctions de rappel pour traiter ses résultats, cependant les fonctions de rappel ne peut pas retourner les valeurs que les fonctions JavaScript typiques peuvent.

    Ainsi, non seulement ils nous enlèvent notre capacité à contrôler la exécution de la fonction mais aussi faire la gestion des erreurs un peu embêtant. C'est là que le Promettre objet vient, car il vise à combler certains des nids-de-poule en codage asynchrone.

    Promettre est techniquement un objet interne standard en JavaScript, ça veut dire 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 exécution du code asynchrone.

    Syntaxe

    Nous pouvons créer un exemple de Promettre objet en utilisant le Nouveau mot-clé:

     nouvelle promesse (fonction (résoudre, rejeter) ); 

    La fonction passé en paramètre au Promettre() le constructeur est connu comme le exécuteur. Il contient le code asynchrone et a deux paramètres de la Une fonction type, dénommé résoudre et rejeter fonctions (plus sur ces sous peu).

    États du Promettre objet

    le Etat initial d'un Promettre l'objet est appelé en attendant. Dans cet état, le résultat du calcul asynchrone n'existe pas.

    L'état initial en attente passe à rempli indiquer quand le calcul est réussi. le résultat du calcul est disponible dans cet état.

    En cas de calcul asynchrone échoue, la Promettre objet se déplace vers le rejeté état de sa première en attendant Etat. Dans cet état, le raison de l'échec du calcul (c'est-à-dire un message d'erreur) est rendu disponible.

    À partir de en attendant à rempli Etat, résoudre() est appelé. À partir de en attendant à rejeté Etat, rejeter() est appelé.

    le puis et capture les méthodes

    Quand l'état changements de en attendant à rempli, le gestionnaire d'événements du Promettre objets puis méthode est exécuté. Et quand l'état changements de en attendant à rejeté, le gestionnaire d'événements du Promettre objets capture méthode est exécuté.

    Exemple 1

    “Non promis” code

    Supposons qu'il y a un bonjour.txt fichier contenant le “Bonjour” mot. Voici comment nous pouvons écrire une demande AJAX à aller chercher ce fichier et montrer son contenu, sans utiliser le Promettre objet:

     function getTxt () let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) case 200: document.write (this.response); Pause; cas 404: lancer 'Fichier non trouvé'; défaut: throw 'Impossible de récupérer le fichier';  catch (err) console.log (err);  getTxt (); 

    Si le contenu du fichier a été récupéré avec succès, c'est à dire. le code d'état de réponse est 200, le texte de la réponse est écrit dans le document. Si le fichier est non trouvé (statut 404), une “Fichier non trouvé” Un message d'erreur est lancé. Sinon, un message d'erreur général indiquant que la récupération du fichier a échoué.

    “Promis” code

    Maintenant Promisify le code ci-dessus:

     function getTxt () retourne une nouvelle promesse (function (résoudre, rejeter) let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) cas 200: résoudre (this.response); cas 404: rejeter ('Fichier non trouvé'); défaut: rejeter ('Echec de récupérer le fichier ');;);  getTxt (). then (function (txt) document.write (txt);). catch (function (err) console.log (err);); 

    le getTxt () la fonction est maintenant codée pour renvoyer une nouvelle instance du Promettre objet, et sa fonction exécuteur contient le code asynchrone d'avant.

    Quand le le code d'état de la réponse est 200, la Promettre est rempli par appel résoudre() (la réponse est passée comme paramètre de résoudre()). Lorsque le code de statut est 404 ou un autre, le Promettre est rejeté en utilisant rejeter() (avec le message d'erreur approprié comme paramètre de rejeter()).

    le gestionnaires d'événements pour le puis() et capture() les méthodes du Promettre objet sont ajouté à la fin.

    Quand le Promettre est rempli, le gestionnaire de la puis() La méthode est exécutée. Son argument est le paramètre passé de résoudre(). Dans le gestionnaire d’événements, le texte de la réponse (reçu en tant qu’argument) est écrit dans le document.

    Quand le Promettre est rejeté, le gestionnaire d'événements du capture() la méthode est exécutée, enregistrer l'erreur.

    le principal avantage de la version promisifiée ci-dessus du code est le la gestion des erreurs. Au lieu de lancer des exceptions non capturées - comme dans la version non promisifiée - le messages d'échec appropriés sont retournés et connectés.

    Mais ce n’est pas seulement le rentrant du messages d'échec mais aussi du résultat du calcul asynchrone cela peut être vraiment avantageux pour nous. Pour voir cela, nous allons devoir développer notre exemple.

    Exemple 2

    “Non promis” code

    Au lieu de simplement afficher le texte de bonjour.txt, je veux combinez-le avec le “Monde” mot et l'afficher à l'écran après une pause de 2 secondes. Voici le code que j'utilise:

     function getTxt () let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) case 200: document.write (concatTxt (this.response)); Pause; cas 404: lancer 'Fichier non trouvé'; défaut: throw 'Impossible de récupérer le fichier';  catch (err) console.log (err);  function concatTxt (res) setTimeout (function () return (res + 'World'), 2000);  getTxt (); 

    Sur le code d'état 200, le concatTxt () la fonction est appelée à concaténer le texte de la réponse avec le “Monde” mot avant de l'écrire dans le document.

    Mais ce code ne fonctionnera pas comme souhaité. le setTimeout () fonction de rappel ne peut pas retourner la chaîne concaténée. Ce qui sera imprimé sur le document est indéfini parce que c'est quoi concatTxt () résultats.

    “Promis” code

    Donc, pour que le code fonctionne, Promisify le code ci-dessus, comprenant concatTxt ():

     function getTxt () retourne une nouvelle promesse (function (résoudre, rejeter) let xhr = new XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) cas 200: résoudre (this.response); cas 404: rejeter ('Fichier non trouvé'); défaut: rejeter ('Echec de récupérer le fichier ');;);  function concatTxt (txt) retourne une nouvelle promesse (function (résoudre, rejeter) setTimeout (function () resol (txt + 'World');, 2000););  getTxt (). then ((txt) => return concatTxt (txt);). then ((txt) => document.write (txt);). catch ((err) => console. log (err);); 

    Juste comme getTxt (), la concatTxt () fonction aussi renvoie un nouveau Promettre objet au lieu du texte concaténé. le Promettre retourné par concatTxt () est résolu à l'intérieur de la fonction de rappel de setTimeout ().

    Vers la fin du code ci-dessus, le gestionnaire d’événements du premier puis() la méthode s'exécute lorsque le Promettre de getTxt () est rempli, c'est-à-dire quand le fichier est récupéré avec succès. À l'intérieur de ce gestionnaire, concatTxt () est appelé et le Promettre retourné par concatTxt () est retourné.

    Le gestionnaire d'événements de la seconde puis() la méthode s'exécute lorsque le Promettre retourné par concatTxt () est rempli, c'est-à-dire le le délai d'attente de deux secondes est terminé et résoudre() est appelé avec la chaîne concaténée comme paramètre.

    finalement, capture() intercepte toutes les exceptions et les messages d'échec des deux promesses.

    Dans cette version promisifiée, le “Bonjour le monde” chaîne sera imprimé avec succès au document.