V tej vadnici bomo spoznali generatorje in njihove razlike s povratnimi klici
Kaj so generatorji?
Generatorji so v zadnjem času postali precej znani v Node.js in to verjetno zaradi tega, kar so sposobni narediti.
- Generatorji so izvršitve funkcij, ki jih je mogoče kasneje začasno ustaviti in nadaljevati.
- Generatorji so uporabni pri izvajanju konceptov, kot je "lenoba". To v bistvu pomeni, da lahko z začasno ustavitvijo izvrševanja in nadaljevanjem po volji potegnemo vrednosti le, kadar je to treba.
Generatorji imajo spodnji dve ključni metodi
- Metoda donosa - metoda funkcije se pokliče v funkciji, da ustavi izvajanje funkcije v določeni vrstici, kjer je klicana metoda donosa.
- Naslednja metoda - Ta metoda se pokliče iz glavne aplikacije za nadaljevanje izvajanja funkcije, ki ima metodo donosa. Izvajanje funkcije se bo nadaljevalo do naslednje metode donosa ali do konca metode.
Oglejmo si primer, kako je mogoče uporabljati generatorje.
V našem primeru bomo imeli preprosto funkcijo Dodaj, ki bo dodala dve številki, vendar bomo še naprej ustavili izvajanje metode na različnih točkah, da pokažemo, kako je mogoče uporabljati generatorje.
function* Add(x) {yield x + 1;var y = yield(null);y = 6return x + y;}var gen = Add(5);gen.next();gen.next();
Pojasnilo kode: -
- Prvi korak je določitev "funkcije" našega generatorja. Upoštevajte, da se to naredi tako, da se ključni besedi funkcije doda "*". Nato definiramo funkcijo, imenovano Add, ki vzame parameter x.
- Ključna beseda yield je specifična za generatorje. Zaradi tega je močan konstrukt za zaustavitev funkcije sredi česar koli. Torej, tukaj se bo izvajanje funkcije ustavilo, dokler ne prikličemo naslednje () funkcije, kar bo izvedeno v 4. koraku. Na tej točki bo vrednost x postala 6 in izvajanje funkcije bo ustavljeno.
- Tu najprej pokličemo funkcijo generatorja in v funkcijo Dodaj pošljemo vrednost 5. Ta vrednost bo nadomeščena s parametrom x naše funkcije Dodaj.
- Ko pokličemo funkcijo next (), bo funkcija Add () nadaljevala izvajanje. Ko bo izveden naslednji stavek var y = yield (null), se funkcija Add () znova ustavi.
- Po ponovnem klicu funkcije next () se bodo zagnali naslednji stavki in dodali in vrnili kombinirano vrednost x = 5 in y = 6.
Povratni klici v primerjavi z generatorji
Generatorji se uporabljajo za reševanje problema tako imenovanega pekla povratnega klica. Včasih se funkcije povratnega klica med razvojem aplikacije Node.js tako ugnezdijo, da postane preprosto preveč zapleteno za uporabo funkcij povratnega klica.
Tu so uporabni generatorji. Eden najpogostejših primerov tega je pri ustvarjanju funkcij časovnika.
Oglejmo si spodnji primer, kako se lahko generatorji izkažejo za koristne pri povratnih klicih.
Naš primer bo ustvaril preprosto funkcijo časovne zakasnitve. Nato bi želeli poklicati to funkcijo, ki vključuje zakasnitev 1000, 2000 in 3000 ms.
Korak 1) Določite našo funkcijo povratnega klica s potrebno kodo zakasnitve.
function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}
Pojasnilo kode: -
- Tu ustvarjamo funkcijo, imenovano Timedelay, s parametrom, imenovanim ptime. To bo zahtevalo potrebno časovno zakasnitev, ki jo želimo vključiti v našo aplikacijo.
- Naslednji korak je samo ustvariti sporočilo, ki se bo prikazalo uporabniku in reklo, da se bo aplikacija ustavila toliko milisekund.
Korak 2) Poglejmo si kodo, če smo vključevali povratne klice. Recimo, da smo želeli vključiti povratne klice na podlagi vrednosti 1000, 2000 in 3000 milisekund, spodnja koda prikazuje, kako bi jih morali uporabiti z uporabo povratnih klicev.
Timedelay(1000, function(message) {console.log(msg);Timedelay(2000, function(message) {console.log(msg);Timedelay(3000, function(message) {console.log(msg);})})})
Pojasnilo kode: -
- Timedelay pokličemo kot povratni klic, vrednost pa 1000.
- Nato želimo ponovno poklicati funkcijo Timedelay z vrednostjo 2000.
- Na koncu želimo ponovno poklicati funkcijo Timedelay s 3000 kot vrednostjo.
Iz zgornje kode lahko vidite, da postane bolj zapletena, saj želimo večkrat začeti klicati funkcijo.
Korak 3) Poglejmo, kako uporabiti isto kodo z uporabo generatorjev. Iz spodnje kode lahko vidite, kako preprosto je postalo izvajati funkcijo Timedelay z uporabo generatorjev.
function* Messages() {console,log(yield(Timedelay(1000, function(){})));console,log(yield(Timedelay(2000, function(){})));console,log(yield(Timedelay(3000, function(){})));}
Pojasnilo kode: -
- Najprej definiramo funkcijo generatorja, ki bo uporabljena za klic naše funkcije Timedelay.
- Kličemo funkcijo Yield skupaj s funkcijo Timedelay s 1000 kot vrednostjo parametra.
- Nato pokličemo funkcijo Yield skupaj s funkcijo Timedelay z vrednostjo 2000 kot vrednost parametra.
- Na koncu pokličemo funkcijo Yield skupaj s funkcijo Timedelay s 3000 kot vrednostjo parametra.
Povzetek
Generatorji se lahko uporabljajo tudi za lajšanje težav z ugnezdenimi povratnimi klici in pomoč pri odstranjevanju tako imenovanega pekla povratnega klica. Generatorji se uporabljajo za zaustavitev obdelave funkcije. To dosežemo z uporabo metode 'yield' v asinhroni funkciji.