Generatori Node.js & Usporedite s povratnim pozivima

U ovom uputstvu naučit ćemo o generatorima i njihovim razlikama s povratnim pozivima

Što su generatori?

Generatori su u Node.js postali prilično poznati u novije vrijeme i to vjerojatno zbog onoga što su sposobni učiniti.

  • Generatori su izvršenja funkcija koja se kasnije mogu obustaviti i nastaviti.
  • Generatori su korisni kada provode koncepte poput "lijenog izvršavanja". To u osnovi znači da smo obustavom izvršenja i nastavkom po volji sposobni povući vrijednosti samo kada to trebamo.

Generatori imaju dolje navedene 2 ključne metode

  1. Metoda prinosa - metoda prinosa poziva se u funkciji da zaustavi izvršavanje funkcije na određenoj liniji gdje se zove metoda prinosa.
  2. Sljedeća metoda - Ova se metoda poziva iz glavne aplikacije za nastavak izvršavanja funkcije koja ima metodu prinosa. Izvršenje funkcije nastavit će se do sljedeće metode prinosa ili do kraja metode.

Pogledajmo primjer kako se generatori mogu koristiti.

U našem primjeru imat ćemo jednostavnu funkciju Add koja će dodati 2 broja, ali nastavit ćemo zaustavljati izvršavanje metode u različitim točkama kako bismo prikazali kako se generatori mogu koristiti.

function* Add(x) {yield x + 1;var y = yield(null);y = 6return x + y;}var gen = Add(5);gen.next();gen.next();

Objašnjenje koda: -

  1. Prvi korak je definiranje "funkcije" našeg generatora. Imajte na umu da se to čini dodavanjem znaka "*" u ključnu riječ funkcije. Tada definiramo funkciju zvanu Add koja uzima parametar x.
  2. Ključna riječ yield specifična je za generatore. To ga čini moćnim konstruktom za pauziranje funkcije usred bilo čega. Dakle, ovdje će se izvršavanje funkcije zaustaviti dok ne pozovemo sljedeću () funkciju, što će biti učinjeno u koraku 4. U ovom trenutku vrijednost x postat će 6, a izvršavanje funkcije će se zaustaviti.
  3. Tu prvo pozivamo funkciju generatora i šaljemo vrijednost 5 našoj funkciji Add. Ova će vrijednost biti zamijenjena u x parametru naše funkcije Add.
  4. Jednom kada pozovemo funkciju next (), funkcija Add () nastavit će izvršavanje. Kada se izvrši sljedeća izjava var y = yield (null), funkcija Add () ponovno će se zaustaviti u izvršavanju.
  5. Nakon ponovnog poziva funkcije next (), izvest će se sljedeći izrazi, a kombinirana vrijednost x = 5 i y = 6 će se dodati i vratiti.

Povratni pozivi u odnosu na generatore

Generatori se koriste za rješavanje problema onoga što je poznato kao pakao povratnog poziva. Ponekad se funkcije povratnog poziva toliko ugnijezde tijekom razvoja aplikacije Node.js da postaje previše komplicirano za upotrebu funkcija povratnog poziva.

Ovdje su generatori korisni. Jedan od najčešćih primjera toga je prilikom stvaranja funkcija odbrojavanja.

Pogledajmo donji primjer kako se generatori mogu pokazati korisnima u slučaju povratnih poziva.

Naš primjer samo će stvoriti jednostavnu funkciju odgode vremena. Tada bismo željeli pozvati ovu funkciju koja uključuje kašnjenje od 1000, 2000 i 3000 ms.

Korak 1) Definirajte našu funkciju povratnog poziva s potrebnim kodom odgode.

function Timedelay(ptime, callback) {setTimeout(function() {callback("Pausing for " + ptime);}, time);}

Objašnjenje koda: -

  1. Ovdje stvaramo funkciju koja se naziva Timedelay s parametrom zvanim ptime. To će potrajati potrebno vremensko kašnjenje koje želimo uvesti u našu aplikaciju.
  2. Sljedeći je korak samo stvoriti poruku koja će se prikazati korisniku rekavši da će aplikacija pauzirati toliko milisekundi.

Korak 2) Pogledajmo sada kod ako smo ugrađivali povratne pozive. Pretpostavimo da smo željeli uključiti povratne pozive na temelju vrijednosti od 1000, 2000 i 3000 milisekundi, donji kod 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: -

  1. Timedelay zovemo kao povratni poziv s vrijednošću 1000.
  2. Dalje želimo ponovno pozvati funkciju Timedelay s vrijednosti 2000.
  3. Napokon, želimo ponovno pozvati funkciju Timedelay s 3000 kao vrijednošću.

Iz gornjeg koda možete vidjeti da postaje neuredniji 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 kako je postalo jednostavno 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: -

  1. Prvo definiramo funkciju generatora koja će se koristiti za pozivanje naše funkcije Timedelay.
  2. Pozivamo funkciju Yield zajedno s funkcijom Timedelay s 1000 kao vrijednošću parametra.
  3. Zatim pozivamo funkciju Yield zajedno s funkcijom Timedelay s 2000 kao vrijednošću parametra.
  4. Napokon, pozivamo funkciju Yield zajedno s funkcijom Timedelay s 3000 kao vrijednošću parametra.

Sažetak

Generatori se također mogu koristiti za ublažavanje problema s ugniježđenim povratnim pozivima i pomoć u uklanjanju onoga što je poznato kao pakao povratnog poziva. Generatori se koriste za zaustavljanje obrade funkcije. To se postiže uporabom metode 'yield' u asinkronoj funkciji.

Zanimljivi članci...