Générateurs Node.js & Comparer avec les rappels

Table des matières:

Anonim

Dans ce tutoriel, nous allons en apprendre davantage sur les générateurs et leurs différences avec les rappels

Que sont les générateurs?

Les générateurs sont devenus assez célèbres dans Node.js ces derniers temps et cela probablement à cause de ce qu'ils sont capables de faire.

  • Les générateurs sont des exécutions de fonctions qui peuvent être suspendues et reprises ultérieurement.
  • Les générateurs sont utiles lors de l'exécution de concepts tels que «l'exécution paresseuse». Cela signifie essentiellement qu'en suspendant l'exécution et en reprenant à volonté, nous ne pouvons extraire des valeurs que lorsque nous en avons besoin.

Les générateurs ont les 2 méthodes clés ci-dessous

  1. Méthode de rendement - La méthode de rendement est appelée dans une fonction pour arrêter l'exécution de la fonction à la ligne spécifique où la méthode de rendement est appelée.
  2. Méthode suivante - Cette méthode est appelée depuis l'application principale pour reprendre l'exécution d'une fonction qui a une méthode yield. L'exécution de la fonction se poursuivra jusqu'à la prochaine méthode yield ou jusqu'à la fin de la méthode.

Regardons un exemple de la façon dont les générateurs peuvent être utilisés.

Dans notre exemple, nous allons avoir une simple fonction Add qui ajoutera 2 nombres, mais nous continuerons d'arrêter l'exécution de la méthode à différents points pour montrer comment les générateurs peuvent être utilisés.

function* Add(x) {yield x + 1;var y = yield(null);y = 6return x + y;}var gen = Add(5);gen.next();gen.next();

Explication du code: -

  1. La première étape consiste à définir notre "fonction" de générateur. Notez que cela se fait en ajoutant un "*" au mot-clé de la fonction. Nous définissons alors une fonction appelée Add qui prend un paramètre de x.
  2. Le mot-clé yield est spécifique aux générateurs. Cela en fait une construction puissante pour mettre en pause une fonction au milieu de quoi que ce soit. Donc, ici, l'exécution de la fonction sera interrompue jusqu'à ce que nous invoquions la fonction next (), ce qui sera fait à l'étape 4. À ce stade, la valeur de x deviendra 6 et l'exécution de la fonction sera arrêtée.
  3. C'est là que nous appelons d'abord la fonction de générateur et envoyons la valeur de 5 à notre fonction Add. Cette valeur sera remplacée dans le paramètre x de notre fonction Add.
  4. Une fois que nous appelons la fonction next (), la fonction Add () reprendra l'exécution. Lorsque l'instruction suivante var y = yield (null) sera exécutée, la fonction Add () cessera à nouveau de s'exécuter.
  5. Maintenant, après avoir appelé à nouveau la fonction next (), les instructions suivantes seront exécutées et la valeur combinée de x = 5 et y = 6 sera ajoutée et renvoyée.

Rappels vs générateurs

Les générateurs sont utilisés pour résoudre le problème de ce que l'on appelle l'enfer du rappel. Parfois, les fonctions de rappel deviennent tellement imbriquées lors du développement d'une application Node.js qu'il devient tout simplement trop compliqué d'utiliser des fonctions de rappel.

C'est là que les générateurs sont utiles. L'un des exemples les plus courants de ceci est la création de fonctions de minuterie.

Voyons l'exemple ci-dessous de la façon dont les générateurs peuvent s'avérer utiles sur les rappels.

Notre exemple créera simplement une fonction de temporisation simple. On voudrait alors appeler cette fonction incorporant un retard de 1000, 2000 et 3000 ms.

Étape 1) Définissez notre fonction de rappel avec le code de délai nécessaire.

function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}

Explication du code: -

  1. Ici, nous créons une fonction appelée Timedelay avec un paramètre appelé ptime. Cela prendra le temps nécessaire que nous souhaitons introduire dans notre application.
  2. L'étape suivante consiste simplement à créer un message, qui sera affiché à l'utilisateur indiquant que l'application va être mise en pause pendant ces nombreux nombres de millisecondes.

Étape 2) Regardons maintenant le code si nous intégrions des rappels. Supposons que nous voulions incorporer des rappels basés sur la valeur de 1000, 2000 et 3000 millisecondes, le code ci-dessous montre comment nous aurions besoin de les implémenter à l'aide de rappels.

Timedelay(1000, function(message) {console.log(msg);Timedelay(2000, function(message) {console.log(msg);Timedelay(3000, function(message) {console.log(msg);})})})

Explication du code: -

  1. Nous appelons le Timedelay comme un rappel avec 1000 comme valeur.
  2. Ensuite, nous voulons appeler à nouveau la fonction Timedelay avec 2000 comme valeur.
  3. Enfin, nous voulons appeler à nouveau la fonction Timedelay avec 3000 comme valeur.

À partir du code ci-dessus, vous pouvez voir que cela devient plus compliqué car nous voulons commencer à appeler la fonction plusieurs fois.

Étape 3) Voyons maintenant comment implémenter le même code à l'aide de générateurs. À partir du code ci-dessous, vous pouvez maintenant voir à quel point il est devenu simple d'implémenter la fonction Timedelay à l'aide de générateurs.

function* Messages() {console,log(yield(Timedelay(1000, function(){})));console,log(yield(Timedelay(2000, function(){})));console,log(yield(Timedelay(3000, function(){})));}

Explication du code: -

  1. Nous définissons d'abord une fonction génératrice qui sera utilisée pour appeler notre fonction Timedelay.
  2. Nous appelons la fonction Yield avec la fonction Timedelay avec 1000 comme valeur de paramètre.
  3. Nous appelons alors la fonction Yield avec la fonction Timedelay avec 2000 comme valeur de paramètre.
  4. Enfin, nous appelons la fonction Yield avec la fonction Timedelay avec 3000 comme valeur de paramètre.

Résumé

Les générateurs peuvent également être utilisés pour atténuer les problèmes liés aux rappels imbriqués et aider à supprimer ce que l'on appelle l'enfer des rappels. Les générateurs sont utilisés pour arrêter le traitement d'une fonction. Ceci est accompli par l'utilisation de la méthode «yield» dans la fonction asynchrone.