Node.js Generators & Usporedi s povratnim pozivima
U ovom vodiču naučit ćemo o Generators i njihove razlike s povratnim pozivima
Što su generatori?
Generatorpostali su prilično poznati u Node.js u novije vrijeme i to vjerojatno zbog onoga što su sposobni učiniti.
- Generators su izvršavanja funkcija koja se mogu obustaviti i nastaviti kasnije.
- Generators su korisni kada se izvode koncepti kao što je 'lijeno izvršenje'. To u osnovi znači da obustavom izvršenja i nastavkom po želji možemo povući vrijednosti samo kada to trebamo.
Generatorimaju sljedeće 2 ključne metode.
- Metoda prinosa – Metoda prinosa poziva se u funkciji kako bi se zaustavilo izvršavanje funkcije u određenom retku gdje se poziva metoda prinosa.
- Sljedeća metoda – Ova se metoda poziva iz glavne aplikacije za nastavak izvršenja funkcije koja ima metodu prinosa. Izvršenje funkcije će se nastaviti do sljedeće metode prinosa ili do kraja metode.
Pogledajmo primjer kako se generatori mogu koristiti.
U našem primjeru, imat ćemo jednostavnu funkciju Dodaj koja će dodati 2 broja, ali ćemo nastaviti zaustavljati izvršenje metode u različitim točkama kako bismo pokazali kako se generatori mogu koristiti.
function* Add(x) { yield x + 1; var y = yield(null); y = 6 return x + y; } var gen = Add(5); gen.next(); gen.next();
Objašnjenje koda
- Prvi korak je definiranje naše "funkcije" generatora. Imajte na umu da se to radi dodavanjem "*" ključnoj riječi funkcije. Zatim definiramo funkciju koja se zove Add koja uzima parametar x.
- Ključna riječ yield specifična je za generatore. To ga čini moćnom konstrukcijom za pauziranje funkcije usred bilo čega. Dakle, ovdje će se izvršavanje funkcije zaustaviti dok ne pozovemo funkciju next(), što će biti učinjeno u koraku 4. U ovom trenutku, vrijednost x će postati 6 i izvršenje funkcije će biti zaustavljeno.
- Ovdje prvo pozivamo funkciju generatora i šaljemo vrijednost 5 našoj funkciji Dodaj. Ova će vrijednost biti zamijenjena u parametru x naše funkcije Dodaj.
- Nakon što pozovemo funkciju next(), funkcija Add() će nastaviti s izvršenjem. Kada se izvrši sljedeća naredba var y= yield(null), funkcija Add() ponovno će se prestati izvršavati.
- Nakon ponovnog pozivanja funkcije next(), pokrenut će se sljedeće izjave, a kombinirana vrijednost x=5 i y=6 bit će dodana i vraćena.
Povratni pozivi u odnosu na generatore
Generatorse koriste za rješavanje problema onoga što je poznato kao pakao povratnog poziva. Ponekad funkcije povratnog poziva postanu toliko ugniježđene tijekom razvoja aplikacije Node.js da jednostavno postane prekomplicirano koristiti funkcije povratnog poziva.
Ovdje su generatori korisni. Jedan od najčešćih primjera ovoga je stvaranje vremenskih funkcija.
Pogledajmo donji primjer kako se generatori mogu pokazati korisnima u odnosu na povratne pozive.
Naš će primjer samo stvoriti jednostavnu funkciju vremenske odgode. Tada bismo htjeli pozvati ovu funkciju koja uključuje odgodu od 1000, 2000 i 3000 ms.
Korak 1) Definirajte našu funkciju povratnog poziva s potrebnim kodom vremenske odgode.
function Timedelay(ptime, callback) { setTimeout(function() { callback("Pausing for " + ptime); }, time); }
Objašnjenje koda
- Ovdje stvaramo funkciju pod nazivom Timedelay s parametrom koji se zove ptime. To će potrajati potrebno vremensko kašnjenje koje želimo uvesti u našu aplikaciju.
- Sljedeći korak je jednostavno kreiranje poruke koja će biti prikazana korisniku govoreći da će aplikacija biti pauzirana na toliko milisekundi.
Korak 2) Sada pogledajmo kod ako uključujemo povratne pozive. Pretpostavimo da želimo uključiti povratne pozive na temelju vrijednosti od 1000, 2000 i 3000 milisekundi, kod u nastavku pokazuje kako bismo ih trebali implementirati pomoću povratnih poziva.
Timedelay(1000, function(message) { console.log(msg); Timedelay(2000, function(message) { console.log(msg); Timedelay(3000, function(message) { console.log(msg); }) }) })
Objašnjenje koda
- Timedelay pozivamo kao povratni poziv s 1000 kao vrijednošću.
- Zatim želimo ponovno pozvati funkciju TimeDelay s 2000 kao vrijednošću.
- Konačno, želimo ponovno pozvati funkciju TimeDelay s 3000 kao vrijednošću.
Iz gornjeg koda možete vidjeti da postaje neurednije jer želimo početi pozivati funkciju više puta.
Korak 3) Pogledajmo sada kako implementirati isti kod pomoću generatora. Iz donjeg koda sada možete vidjeti koliko je jednostavno postalo implementirati funkciju TimeDelay pomoću generatora.
function* Messages() { console,log(yield(Timedelay(1000, function(){}))); console,log(yield(Timedelay(2000, function(){}))); console,log(yield(Timedelay(3000, function(){}))); }
Objašnjenje koda
- Prvo definiramo funkciju generatora koja će se koristiti za pozivanje naše funkcije TimeDelay.
- Pozivamo funkciju Yield zajedno s funkcijom TimeDelay s 1000 kao vrijednošću parametra.
- Zatim pozivamo funkciju Yield zajedno s funkcijom TimeDelay s 2000 kao vrijednošću parametra.
- Konačno, pozivamo funkciju Yield zajedno s funkcijom TimeDelay s 3000 kao vrijednošću parametra.
Rezime
Generators se također može koristiti za ublažavanje problema s ugniježđenim povratnim pozivima i pomoći u uklanjanju onoga što je poznato kao pakao povratnih poziva. Generators se koriste za zaustavljanje obrade funkcije. To se postiže upotrebom metode 'yield' u asinkronoj funkciji.