node.js Generators & Sammenlign med tilbagekald

I denne tutorial skal vi lære om Generators og deres forskelle med tilbagekald

Hvad er generatorer?

Generators er blevet ret berømt i node.js i nyere tid, og det er nok på grund af, hvad de er i stand til at gøre.

  • Generators er funktionsudførelser, der kan suspenderes og genoptages på et senere tidspunkt.
  • Generators er nyttige, når du udfører koncepter som 'doven udførelse'. Dette betyder dybest set, at ved at suspendere eksekveringen og genoptage efter behag, er vi kun i stand til at trække værdier, når vi har brug for det.

Generators har nedenstående 2 nøglemetoder.

  1. Udbyttemetode – Udbyttemetoden kaldes i en funktion for at stoppe udførelsen af ​​funktionen på den specifikke linje, hvor udbyttemetoden kaldes.
  2. Næste metode – Denne metode kaldes fra hovedapplikationen for at genoptage udførelsen af ​​en funktion, som har en udbyttemetode. Udførelsen af ​​funktionen vil fortsætte indtil den næste udbyttemetode eller til slutningen af ​​metoden.

Lad os se på et eksempel på, hvordan generatorer kan bruges.

I vores eksempel vil vi have en simpel Tilføj-funktion, som tilføjer 2 tal, men vi vil blive ved med at standse metodeudførelsen på forskellige punkter for at vise, hvordan generatorer kan bruges.

node.js Generators

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

var gen = Add(5);

gen.next();

gen.next(); 

Kode Forklaring

  1. Det første trin er at definere vores generator "funktion". Bemærk, at dette gøres ved at tilføje et "*" til funktionsnøgleordet. Vi definerer så en funktion kaldet Add, som tager parameteren x.
  2. Udbyttesøgeordet er specifikt for generatorer. Dette gør det til en kraftfuld konstruktion til at sætte en funktion på pause midt i hvad som helst. Så her vil funktionsudførelsen blive standset, indtil vi kalder den næste() funktion, hvilket vil blive udført i Trin 4. På dette tidspunkt vil værdien af ​​x blive 6, og udførelsen af ​​funktionen stoppes.
  3. Det er her vi først kalder generatorfunktionen og sender værdien 5 til vores Tilføj funktion. Denne værdi vil blive erstattet i x-parameteren i vores Tilføj-funktion.
  4. Når vi kalder den næste()-funktion, vil Add()-funktionen genoptage udførelsen. Når den næste sætning var y= yield(null) vil blive udført, vil Add()-funktionen igen stoppe med at udføre.
  5. Efter at have kaldt funktionen next() igen, vil de næste sætninger køre, og den kombinerede værdi af x=5 og y=6 vil blive tilføjet og returneret.

Tilbagekald vs. generatorer

Generators bruges til at løse problemet med det, der er kendt som tilbagekaldshelvede. Nogle gange bliver tilbagekaldsfunktioner så indlejrede under udviklingen af ​​en Node.js-applikation, at det bare bliver for kompliceret at bruge tilbagekaldsfunktioner.

Det er her generatorer er nyttige. Et af de mest almindelige eksempler på dette er, når du opretter timerfunktioner.

Lad os se nedenstående eksempel på, hvordan generatorer kan vise sig at være nyttige over tilbagekald.

Vores eksempel vil blot skabe en simpel tidsforsinkelsesfunktion. Vi vil så kalde denne funktion med en forsinkelse på 1000, 2000 og 3000 ms.

Trin 1) Definer vores tilbagekaldsfunktion med den nødvendige tidsforsinkelseskode.

Tilbagekald vs. Generators

function Timedelay(ptime, callback) {

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

Kode Forklaring

  1. Her laver vi en funktion kaldet Timedelay med en parameter kaldet ptime. Dette vil tage den nødvendige tidsforsinkelse, vi ønsker at indføre i vores ansøgning.
  2. Det næste trin er bare at oprette en besked, som vil blive vist til brugeren, der siger, at applikationen vil være på pause i disse mange antal millisekunder.

Trin 2) Lad os nu se på koden, hvis vi inkorporerede tilbagekald. Antag, at vi ønskede at inkorporere tilbagekald baseret på værdien af ​​1000, 2000 og 3000 millisekunder, koden nedenfor viser, hvordan vi skal implementere disse ved hjælp af tilbagekald.

Tilbagekald vs. Generators

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

Kode Forklaring

  1. Vi kalder Timedelay som et tilbagekald med 1000 som værdi.
  2. Dernæst vil vi kalde Timedelay-funktionen igen med 2000 som værdi.
  3. Til sidst vil vi kalde Timedelay-funktionen igen med 3000 som værdi.

Fra ovenstående kode kan du se, at det bliver mere rodet, da vi vil begynde at kalde funktionen flere gange.

Trin 3) Lad os nu se, hvordan man implementerer den samme kode ved hjælp af generatorer. Fra nedenstående kode kan du nu se, hvor enkelt det er blevet at implementere Timedelay-funktionen ved hjælp af generatorer.

Tilbagekald vs. Generators

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

Kode Forklaring

  1. Vi er først ved at definere en generatorfunktion, som vil blive brugt til at kalde vores tidsforsinkelsesfunktion.
  2. Vi kalder Yield-funktionen sammen med Timedelay-funktionen med 1000 som parameterværdi.
  3. Vi kalder derefter Yield-funktionen sammen med Timedelay-funktionen med 2000 som parameterværdi.
  4. Til sidst kalder vi Yield-funktionen sammen med Timedelay-funktionen med 3000 som parameterværdi.

Resumé

Generators kan også bruges til at afhjælpe problemerne med indlejrede tilbagekald og hjælpe med at fjerne det, der er kendt som tilbagekaldshelvede. Generators bruges til at standse behandlingen af ​​en funktion. Dette opnås ved brug af 'udbytte'-metoden i den asynkrone funktion.