Generatorer i JavaScript | Forklart med eksempler

Generatorer i JavaScript | Forklart med eksempler
Generatorer er funksjoner som brukes til å få flere verdier til forskjellige tider. Generatorer er litt komplekse å forstå, så vi skal definere hvilke generatorer som er med enkle ord og deretter gå i detalj om generatorer og deres arbeid.

JavaScript kommer ofte med løsninger for forskjellige problemer, spesielt med ankomsten av ES6 -versjonen av JavaScript. En av nøkkelfunksjonene som ble introdusert i ES6 var generatorer, generatorer i JavaScript brukes med iteratorer for å lage en strøm av data eller en strøm av data. Generatorer hjelper oss med å unngå tilbakeringingsfunksjonsproblemer.

Hva som faktisk er generatorer

Med enkle ord er generatorer spesielle funksjoner; I motsetning til normale funksjoner som bare har en returerklæring, returnerer generatorer flere verdier, men til forskjellige tider.

For å være mer beskrivende, er generatorer funksjoner som returnerer verdien midtveis gjennom funksjonen og deretter slutter å utføre etter å ha lagret tilstanden, dette trinnet med å returnere en verdi, lagre tilstand og stanse utførelse kalles gi fra seg en verdi og pause.

I løpet av denne pausen kan programmet fungere med en annen funksjonalitet, og når vi er påkrevd, blir generatoren bedt om å returnere neste verdi, men heller enn å starte hele funksjonen på nytt, løper generatoren fra det punktet der den stoppet og gir den Neste verdi. Dermed å lage en konstant strøm av data. Det er grunnen til at disse funksjonene kalles "generatorer" når de brukes til å generere datastrømmen.

Vi kan se på følgende arbeidsdiagrammer for bedre å forstå forskjellen mellom normale og generatorfunksjoner:

Og generatorfunksjon fungerer slik:

Hvordan definere en generatorfunksjon?

Siden generatorfunksjoner er spesielle funksjoner, er det derfor vi bruker et spesielt søkeord mens vi definerer dem som er "funksjon*" - Stjerne etter funksjonsnøkkelordet. Syntaksen er som:

funksjon* funksjonsnavn (params)
// Body of the Function
avkastningsverdi;

'

Merk:

  • Funksjon*: nøkkelord for å definere generatorfunksjoner
  • Funksjonsnavn: Identifikatoren for denne funksjonen
  • Params: Valgfrie parametere som du vil bruke
  • Utbytte: Returnerer verdien og stopper utførelsen av funksjonen

Returverdi: Objekt [generator] - et generatorobjekt ELLER udefinert hvis generatoren er tom

Vi er nå kjent med hva en generatorfunksjon er, men vi er fremdeles ikke kjent med returtypen som er "generatorobjektet".

Hva er et generatorobjekt?

Når en generatorfunksjon opprettes, returnerer den et objekt som vi må initialisere i en eller annen variabel, er denne variabelen da kjent som generatorobjektet. Dette generatorobjektet brukes til å få neste verdi fra funksjonen.

Syntaks å initialisere et generatorobjekt

variabel = generatorFunctionName (argumenter);

Etter at du har opprettet generatorobjektet, kan du bruke funksjonen "gjenstand.Neste () ”

De gjenstand.Neste () Returnerer et JSON -objekt med to egenskaper, den ene er "verdien" og den andre er "Ferdig ” eiendom.

Få verdier fra en generatorfunksjon

La oss lage en enkel generatorfunksjon som vil gi oss en ny verdi hver gang den kalles, med følgende kodelinjer:

funksjon* generator ()
avkastning 1;
avkastning "funnet";
avkastning 3;

Nå som vi har en generator, må vi initialisere den med et generatorobjekt, gjør vi det med følgende uttalelse:

const GenObject = Generator ();

Nå har vi også generatorobjektet. Alt vi trenger å gjøre nå er å ringe Neste () Funksjonen til generatorobjektet og skriv ut JSON -objektet med konsoll.Logg() funksjon.

konsoll.Logg (Genobject.neste ());
konsoll.Logg (Genobject.neste ());
konsoll.Logg (Genobject.neste ());

Det komplette kodebiten ser slik ut:

funksjon* generator ()
avkastning 1;
avkastning "funnet";
avkastning 3;

const GenObject = Generator ();
konsoll.Logg (Genobject.neste ());
konsoll.Logg (Genobject.neste ());
konsoll.Logg (Genobject.neste ());

Vi får følgende utdata:

Som du ser har vi skrevet ut 3 forskjellige JSON -objekter med 3 forskjellige samtaler til samme generatorfunksjon. Men noen ganger vil vi bruke verdien, ikke JSON -objektet. Vi kan gjøre det ved å få tilgang til verdi Eiendom til JSON -objektet med følgende kodeinje:

konsoll.Logg (Genobject.Neste ().verdi);
konsoll.Logg (Genobject.Neste ().verdi);
konsoll.Logg (Genobject.Neste ().verdi);

Med disse linjene får vi følgende utgang:

Som du kan se, gjenstand.Neste ().verdi Returnerer oss en verdi som vi til og med kan gi videre til en annen funksjon.

Arbeid av generatorfunksjon i utførelse av samtidig kode

For denne opplæringen, la oss opprette en enkel generatorfunksjon som vil gi tall fra 1 til 5 og etter hvert tall som vi henter fra generatoren, vil programmet vårt varsle oss om at det gjør noen beregninger på det tallet og har forlatt generatorfunksjonen.

Det første trinnet er å lage en generatorfunksjon som vil gi 5 forskjellige tall på 5 forskjellige samtaler med følgende kodelinjer:

funksjon* generator ()
konsoll.logg ("generatorfunksjon initialisert");
for (la i = 1; i <= 5; i++)
konsoll.Logg ("Inside Generator for New Yield");
avkastning i;

Som du ser, har vi laget en sløyfe som vil returnere 1 nytt heltall på hver generatorutbytte og be oss om når programmet er inne i generatorfunksjonen.

Nå må vi initialisere denne generatorfunksjonen med generatorobjektet med følgende kodelinje.

const GenObject = Generator ();

Nå trenger vi en funksjon som vil gjøre noe arbeid med de avkastede verdiene, lage funksjonen ved å bruke følgende linjer:

funksjon tabellPrinter (num)
konsoll.Logg ('Skriv ut tabellen til:' + num) for øyeblikket;

Vi har en generatorfunksjon, et generatorobjekt og en funksjon som vil fungere på noen verdier som sendes inni det. Nå, alt vi trenger er en iterator som vil iterere gjennom generatorobjektet og gi verdiene til funksjonen. Vi gjør det ved å bruke følgende kodelinjer:

BodedValue = Genobject.Neste ().verdi;
mens (gaedValue)
tabellPrinter (BleedValue);
BodedValue = Genobject.Neste ().verdi;

Hva denne koden vil gjøre er at den vil ta neste verdi fra generatoren og lagre den inne i en variabel. Så i stundsløyfen vil den sjekke om variabelen er udefinert eller ikke, og hvis den ikke er udefinert, vil den passere denne verdien til funksjonen "tabellprinter ” og gå videre til neste verdi.

Det komplette kodebiten er som:

funksjon* generator ()
konsoll.logg ("generatorfunksjon initialisert");
for (la i = 1; i <= 5; i++)
konsoll.Logg ("Inside Generator for New Yield");
avkastning i;


const GenObject = Generator ();
funksjon tabellPrinter (num)
konsoll.Logg ('Skriv ut tabellen til:' + num) for øyeblikket;

BodedValue = Genobject.Neste ().verdi;
mens (gaedValue)
tabellPrinter (BleedValue);
BodedValue = Genobject.Neste ().verdi;

Utgangen til følgende kode er:

Som du kan se, går programmet inn i generatorfunksjonen og gir en ny verdi, sparer stater, tar en pause utførelsen av funksjonen, går inn i "tabellprinter ” funksjon, og utfører henrettelse der. Når det er gjort, går det tilbake i generatorfunksjonen for et nytt avkastning. Hele prosessen gjentas til generatoren fortsetter å produsere nye avkastninger. Dermed gjør det til en strøm av data.

Det er det for generatorer i JavaScript.

Konklusjon

Generatorer er spesielle funksjoner som kan stoppe utførelsen midtveis for å gi en verdi, redde tilstanden og la programmet utføre andre oppgaver. Når det er nødvendig, generatorfunksjonen “gjenopptar ” deres henrettelse fra staten som de gikk til pause i. Generatorer brukes til å generere en konstant strøm av data. De brukes i samarbeid med løfter og iteratorer for å lage en uendelig strøm av data og for å unngå tilbakeringingsfunksjonsproblemer.