I denne opplæringen skal vi lære om generatorer og deres forskjeller med tilbakekallinger
Hva er generatorer?
Generatorer har blitt ganske berømte i Node.js i nyere tid, og det sannsynligvis på grunn av hva de er i stand til å gjøre.
- Generatorer er funksjonskjøringer som kan suspenderes og gjenopptas på et senere tidspunkt.
- Generatorer er nyttige når du utfører konsepter som 'lat utførelse'. Dette betyr i utgangspunktet at ved å stanse utførelsen og gjenoppta etter eget ønske, er vi i stand til å trekke verdier bare når vi trenger det.
Generatorer har de to viktigste metodene nedenfor
- Avkastningsmetode - Avkastningsmetoden kalles i en funksjon for å stoppe utførelsen av funksjonen på den spesifikke linjen der avkastningsmetoden kalles.
- 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 Legg til-funksjon som vil legge til 2 tall, men vi vil fortsette å stoppe metodeutførelsen på forskjellige punkter for å vise hvordan generatorer kan brukes.
function* Add(x) {yield x + 1;var y = yield(null);y = 6return x + y;}var gen = Add(5);gen.next();gen.next();
Kode Forklaring: -
- Det første trinnet er å definere generatorens "funksjon". Merk at dette gjøres ved å legge til et "*" til funksjonsnøkkelordet. Vi definerer deretter en funksjon kalt Add som tar en parameter på x.
- Avkastningsnøkkelordet er spesifikt for generatorer. Dette gjør det til en kraftig konstruksjon for å stoppe en funksjon midt i alt. Så her vil funksjonsutførelsen bli stoppet til vi påkaller neste () funksjon, som vil bli gjort i trinn 4. På dette tidspunktet blir verdien til x 6 og utførelsen av funksjonen vil bli stoppet.
- Det er her vi først kaller generatorfunksjonen og sender verdien 5 til Add-funksjonen vår. Denne verdien vil bli erstattet av x-parameteren til funksjonen vår.
- Når vi kaller neste () funksjon, vil funksjonen Legg til () gjenoppta kjøringen. Når neste setning var y = yield (null) vil bli kjørt, vil funksjonen Add () igjen stoppe kjøringen.
- Etter å ha kalt neste () -funksjon igjen, vil de neste setningene kjøre, og den kombinerte verdien av x = 5 og y = 6 vil bli lagt til og returnert.
Tilbakekallinger mot generatorer
Generatorer brukes til å løse problemet med det som kalles tilbakeringingshelvete. Noen ganger blir tilbakeringingsfunksjoner så nestet under utviklingen av et Node.js-program at det bare 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 om hvordan generatorer kan vise seg å være nyttige over tilbakeringinger.
Eksemplet vårt vil bare opprette en enkel tidsforsinkelsesfunksjon. Vi vil da kalle denne funksjonen som inneholder en forsinkelse på 1000, 2000 og 3000 ms.
Trinn 1) Definer tilbakeringingsfunksjonen vår med den nødvendige tidsforsinkelseskoden.
function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}
Kode Forklaring: -
- Her lager vi en funksjon kalt Timedelay med en parameter som heter ptime. Dette vil ta den nødvendige tidsforsinkelsen vi ønsker å innføre i søknaden vår.
- Det neste trinnet er å bare opprette en melding som vil vises for brukeren og sier at applikasjonen kommer til å være en pause i disse mange antall millisekunder.
Trinn 2) La oss nå se på koden hvis vi brukte tilbakeringinger. Anta at vi ønsket å innlemme tilbakeringinger basert på verdien 1000, 2000 og 3000 millisekunder, koden nedenfor viser hvordan vi trenger å implementere disse ved hjelp av tilbakeringinger.
Timedelay(1000, function(message) {console.log(msg);Timedelay(2000, function(message) {console.log(msg);Timedelay(3000, function(message) {console.log(msg);})})})
Kode Forklaring: -
- Vi kaller Timedelay som tilbakeringing med 1000 som verdi.
- Deretter vil vi kalle Timedelay-funksjonen igjen med 2000 som verdi.
- Til slutt vil vi kalle Timedelay-funksjonen igjen med 3000 som verdi.
Fra koden ovenfor kan du se at det blir rotere ettersom vi vil 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.
function* Messages() {console,log(yield(Timedelay(1000, function(){})));console,log(yield(Timedelay(2000, function(){})));console,log(yield(Timedelay(3000, function(){})));}
Kode Forklaring: -
- Vi definerer først en generatorfunksjon som skal brukes til å kalle vår Timedelay-funksjon.
- Vi kaller Yield-funksjonen sammen med Timedelay-funksjonen med 1000 som parameterverdi.
- Vi kaller deretter Yield-funksjonen sammen med Timedelay-funksjonen med 2000 som parameterverdi.
- Til slutt kaller vi Yield-funksjonen sammen med Timedelay-funksjonen med 3000 som parameterverdi.
Sammendrag
Generatorer kan også brukes til å lindre problemene med nestede tilbakeringinger og hjelpe til med å fjerne det som kalles tilbakeringingshelvete. Generatorer brukes til å stoppe behandlingen av en funksjon. Dette oppnås ved bruk av 'utbytte' -metoden i den asynkrone funksjonen.