node.js Generators & Sammenlign med tilbakeringinger

I denne opplæringen skal vi lære om Generators og deres forskjeller med tilbakeringinger

Hva er generatorer?

Generators har blitt ganske kjent i node.js i nyere tid og det er nok på grunn av hva de er i stand til å gjøre.

  • Generators er funksjonskjøringer som kan suspenderes og gjenopptas på et senere tidspunkt.
  • Generators er nyttige når du utfører konsepter som "lat utførelse". Dette betyr i bunn og grunn at ved å suspendere utførelse og gjenoppta etter ønske, er vi i stand til å trekke verdier bare når vi trenger det.

Generators har de 2 nøkkelmetodene nedenfor.

  1. Avkastningsmetode – Avkastningsmetoden kalles inn en funksjon for å stoppe utførelsen av funksjonen på den spesifikke linjen der avkastningsmetoden kalles.
  2. Neste metode – Denne metoden kalles fra hovedapplikasjonen for å gjenoppta kjøringen av en funksjon som har en avkastningsmetode. Utførelsen av funksjonen vil fortsette til neste avkastningsmetode eller til slutten av metoden.

La oss se på et eksempel på hvordan generatorer kan brukes.

I vårt eksempel skal vi ha en enkel Add-funksjon som vil legge til 2 tall, men vi vil fortsette å stoppe metodekjøringen på forskjellige punkter for å vise frem hvordan generatorer kan brukes.

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 trinnet er å definere generatorens "funksjon". Merk at dette gjøres ved å legge til en "*" til funksjonsnøkkelordet. Vi definerer da en funksjon kalt Add som tar parameteren x.
  2. Yield-nøkkelordet er spesifikt for generatorer. Dette gjør det til en kraftig konstruksjon for å sette en funksjon på pause midt i alt. Så her vil funksjonskjøringen stoppes til vi starter neste() funksjonen, som vil bli gjort i trinn 4. På dette tidspunktet vil verdien av x bli 6 og utførelsen av funksjonen stoppes.
  3. Det er her vi først kaller generatorfunksjonen og sender verdien på 5 til Add-funksjonen vår. Denne verdien vil bli erstattet i x-parameteren til Add-funksjonen vår.
  4. Når vi kaller neste()-funksjonen, vil Add()-funksjonen gjenoppta kjøringen. Når neste setning var y= yield(null) vil bli utført, vil Add()-funksjonen igjen slutte å kjøre.
  5. Nå etter å ha kalt next()-funksjonen igjen, vil de neste setningene kjøre, og den kombinerte verdien av x=5 og y=6 vil bli lagt til og returnert.

Tilbakeringinger vs. generatorer

Generators brukes til å løse problemet med det som er kjent som tilbakeringingshelvete. Noen ganger blir tilbakeringingsfunksjoner så nestet under utviklingen av en Node.js-applikasjon at det rett og slett blir for komplisert å bruke tilbakeringingsfunksjoner.

Det er her generatorer er nyttige. Et av de vanligste eksemplene på dette er når du lager timerfunksjoner.

La oss se eksemplet nedenfor på hvordan generatorer kan vise seg å være nyttige over tilbakeringinger.

Vårt eksempel vil bare lage en enkel tidsforsinkelsesfunksjon. Vi vil da kalle denne funksjonen med en forsinkelse på 1000, 2000 og 3000 ms.

Trinn 1) Definer vår tilbakeringingsfunksjon med den nødvendige tidsforsinkelseskoden.

Tilbakeringinger vs. Generators

function Timedelay(ptime, callback) {

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

Kode Forklaring

  1. Her lager vi en funksjon kalt Timedelay med en parameter kalt ptime. Dette vil ta med den nødvendige tidsforsinkelsen vi ønsker å innføre i søknaden vår.
  2. Det neste trinnet er å bare lage en melding, som vil vises til brukeren som sier at applikasjonen kommer til å være pause i disse mange millisekunder.

Trinn 2) La oss nå se på koden hvis vi inkorporerte tilbakeringinger. Anta at vi ønsket å inkludere tilbakeringinger basert på verdien av 1000, 2000 og 3000 millisekunder, viser koden nedenfor hvordan vi trenger å implementere disse ved å bruke tilbakeringinger.

Tilbakeringinger 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 kaller Timedelay som en tilbakeringing med 1000 som verdi.
  2. Deretter vil vi kalle Timedelay-funksjonen igjen med 2000 som verdi.
  3. Til slutt ønsker vi å kalle Timedelay-funksjonen igjen med 3000 som verdi.

Fra koden ovenfor kan du se at det blir mer rotete ettersom vi ønsker å begynne å ringe funksjonen flere ganger.

Trinn 3) La oss nå se hvordan du implementerer den samme koden ved hjelp av generatorer. Fra koden nedenfor kan du nå se hvor enkelt det har blitt å implementere Timedelay-funksjonen ved hjelp av generatorer.

Tilbakeringinger 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 definerer først en generatorfunksjon som skal brukes til å kalle vår tidsforsinkelsesfunksjon.
  2. Vi kaller Yield-funksjonen sammen med Timedelay-funksjonen med 1000 som parameterverdi.
  3. Vi kaller deretter Yield-funksjonen sammen med Timedelay-funksjonen med 2000 som parameterverdi.
  4. Til slutt kaller vi Yield-funksjonen sammen med Timedelay-funksjonen med 3000 som parameterverdi.

Sammendrag

Generators kan også brukes til å lindre problemene med nestede tilbakeringinger og hjelpe til med å fjerne det som er kjent som tilbakeringingshelvetet. Generators brukes til å stoppe behandlingen av en funksjon. Dette oppnås ved bruk av 'yield'-metoden i den asynkrone funksjonen.