I denne vejledning vil vi lære om generatorer og deres forskelle med tilbagekald
Hvad er generatorer?
Generatorer er blevet ganske berømte i Node.js i nyere tid, og det sandsynligvis på grund af hvad de er i stand til at gøre.
- Generatorer er funktionsudførelser, der kan suspenderes og genoptages på et senere tidspunkt.
- Generatorer er nyttige, når man udfører begreber som 'doven udførelse'. Dette betyder grundlæggende, at ved at suspendere udførelse og genoptage efter eget valg er vi kun i stand til at trække værdier, når vi har brug for det.
Generatorer har nedenstående to nøglemetoder
- Yield-metode - Udbyttemetoden kaldes i en funktion for at stoppe udførelsen af funktionen på den specifikke linje, hvor udbyttemetoden kaldes.
- Næste metode - Denne metode kaldes fra hovedapplikationen for at genoptage udførelsen af en funktion, der har en udbyttemetode. Udførelsen af funktionen fortsætter til næste afkastmetode eller indtil afslutningen af metoden.
Lad os se på et eksempel på, hvordan generatorer kan bruges.
I vores eksempel vil vi have en simpel tilføjelsesfunktion, der tilføjer 2 tal, men vi fortsætter med at standse metodeudførelsen på forskellige punkter for at vise, hvordan generatorer kan bruges.
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 trin er at definere vores generator "funktion". Bemærk, at dette gøres ved at tilføje et "*" til funktionsnøgleordet. Vi definerer derefter en funktion kaldet Tilføj, som tager en parameter på x.
- Udbytte nøgleordet er specifikt for generatorer. Dette gør det til en kraftig konstruktion til pause i en funktion midt i noget. Så her stoppes funktionens udførelse, indtil vi påberåber den næste () funktion, som vil blive udført i trin 4. På dette tidspunkt bliver værdien af x 6, og udførelsen af funktionen stoppes.
- Det er her, vi først kalder generatorfunktionen og sender værdien 5 til vores Tilføj-funktion. Denne værdi erstattes i x-parameteren i vores Tilføj-funktion.
- Når vi kalder den næste () funktion, vil funktionen Add () genoptage udførelsen. Når den næste sætning var y = yield (null) udføres, stopper funktionen Add () igen eksekveringen.
- Efter at have kaldt den næste () funktion igen, kører de næste udsagn, og den kombinerede værdi af x = 5 og y = 6 tilføjes og returneres.
Tilbagekald mod generatorer
Generatorer bruges til at løse problemet med hvad der kaldes callback helvede. Nogle gange bliver tilbagekaldsfunktioner så indlejrede under udviklingen af et Node.js-program, at det bare bliver for kompliceret til at bruge tilbagekaldsfunktioner.
Det er her, generatorer er nyttige. Et af de mest almindelige eksempler på dette er, når man opretter timerfunktioner.
Lad os se nedenstående eksempel på, hvordan generatorer kan vise sig at være nyttige over tilbagekald.
Vores eksempel opretter bare 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.
function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}
Kode Forklaring: -
- Her opretter vi en funktion kaldet Timedelay med en parameter kaldet ptime. Dette vil tage den nødvendige tidsforsinkelse, som vi ønsker at indføre i vores ansøgning.
- Det næste trin er bare at oprette en besked, der vises for brugeren, der siger, at applikationen vil være pause i disse mange antal millisekunder.
Trin 2) Lad os nu se på koden, hvis vi inkorporerer tilbagekald. Antag, at vi ønskede at inkorporere tilbagekald baseret på værdien på 1000, 2000 og 3000 millisekunder, nedenstående kode viser, hvordan vi har brug for at implementere disse ved hjælp af tilbagekald.
Timedelay(1000, function(message) {console.log(msg);Timedelay(2000, function(message) {console.log(msg);Timedelay(3000, function(message) {console.log(msg);})})})
Kode Forklaring: -
- Vi kalder Timedelay som et tilbagekald med 1000 som værdi.
- Dernæst vil vi kalde Timedelay-funktionen igen med 2000 som værdi.
- Endelig 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 ringe til funktionen flere gange.
Trin 3) Lad os nu se, hvordan du implementerer den samme kode ved hjælp af generatorer. Fra nedenstående kode kan du nu se, hvor simpelt det er blevet at implementere Timedelay-funktionen ved hjælp af 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 generatorfunktion, som bruges til at kalde vores Timedelay-funktion.
- Vi kalder Yield-funktionen sammen med Timedelay-funktionen med 1000 som parameterværdi.
- Vi kalder derefter Yield-funktionen sammen med Timedelay-funktionen med 2000 som parameterværdi.
- Endelig kalder vi Yield-funktionen sammen med Timedelay-funktionen med 3000 som parameterværdi.
Resumé
Generatorer kan også bruges til at lindre problemerne med indlejrede tilbagekald og hjælpe med at fjerne det, der kaldes tilbagekaldshelvede. Generatorer bruges til at standse behandlingen af en funktion. Dette opnås ved brug af 'udbytte'-metoden i den asynkrone funktion.