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.
- Avkastningsmetode โ Avkastningsmetoden kalles inn 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 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.
function* Add(x) {
yield x + 1;
var y = yield(null);
y = 6
return x + y;
}
var gen = Add(5);
gen.next();
gen.next();
Code Forklaring
- 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.
- 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.
- 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.
- 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.
- 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.
function Timedelay(ptime, callback) {
setTimeout(function() {
callback("Pausing for " + ptime);
}, time);
}
Code Forklaring
- 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.
- 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.
Timedelay(1000, function(message) {
console.log(msg);
Timedelay(2000, function(message) {
console.log(msg);
Timedelay(3000, function(message) {
console.log(msg);
})
})
})
Code Forklaring
- Vi kaller Timedelay som en tilbakeringing med 1000 som verdi.
- Deretter vil vi kalle Timedelay-funksjonen igjen med 2000 som verdi.
- 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.
function* Messages() {
console,log(yield(Timedelay(1000, function(){})));
console,log(yield(Timedelay(2000, function(){})));
console,log(yield(Timedelay(3000, function(){})));
}
Code Forklaring
- Vi definerer fรธrst en generatorfunksjon som skal brukes til รฅ kalle vรฅr tidsforsinkelsesfunksjon.
- 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
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.




