Generatoare Node.js & Comparați cu Rambursări

Cuprins:

Anonim

În acest tutorial, vom învăța despre generatoare și diferențele lor cu apelurile de apel

Ce sunt generatoarele?

Generatoarele au devenit destul de faimoase în Node.js în ultima perioadă și probabil din cauza a ceea ce sunt capabili să facă.

  • Generatoarele sunt execuții de funcții care pot fi suspendate și reluate ulterior.
  • Generatoarele sunt utile atunci când se realizează concepte precum „execuția leneșă”. Aceasta înseamnă practic că, suspendând execuția și reluând după bunul plac, suntem capabili să extragem valori numai atunci când avem nevoie.

Generatoarele au cele 2 metode cheie de mai jos

  1. Metoda randamentului - Metoda randamentului este apelată într-o funcție pentru a opri executarea funcției la linia specifică unde se numește metoda randamentului.
  2. Metoda următoare - Această metodă este apelată de la aplicația principală pentru a relua executarea unei funcții care are o metodă de randament. Executarea funcției va continua până la următoarea metodă de randament sau până la sfârșitul metodei.

Să vedem un exemplu de modul în care generatoarele pot fi utilizate.

În exemplul nostru, vom avea o funcție simplă de adăugare care va adăuga 2 numere, dar vom continua să oprim execuția metodei în diferite puncte pentru a arăta cum pot fi utilizate generatoarele.

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

Cod Explicație: -

  1. Primul pas este să ne definim „funcția” generatorului. Rețineți că acest lucru se face prin adăugarea unui „*” la cuvântul cheie funcție. Definim apoi o funcție numită Adăugare care ia un parametru de x.
  2. Cuvântul cheie randament este specific generatoarelor. Acest lucru îl face o construcție puternică pentru întreruperea unei funcții în mijlocul oricărui lucru. Deci, aici, execuția funcției va fi oprită până când vom invoca funcția next (), care va fi realizată în Pasul 4. În acest moment, valoarea lui x va deveni 6 și executarea funcției va fi oprită.
  3. Aici apelăm mai întâi funcția generator și trimitem valoarea 5 la funcția noastră Adăugare. Această valoare va fi substituită în parametrul x al funcției noastre Adăugare.
  4. Odată ce apelăm funcția next (), funcția Add () va relua execuția. Când următoarea instrucțiune var y = randament (nul) va fi executată, funcția Adăugare () va opri din nou executarea.
  5. Acum, după ce ați apelat din nou funcția next (), următoarele instrucțiuni vor rula, iar valoarea combinată a x = 5 și y = 6 va fi adăugată și returnată.

Rambursări vs. generatoare

Generatoarele sunt utilizate pentru a rezolva problema a ceea ce este cunoscut sub numele de callback hell. Uneori, funcțiile de apel invers devin atât de imbricate în timpul dezvoltării unei aplicații Node.js încât devine prea complicat să folosiți funcțiile de apel invers.

Aici sunt utile generatoarele. Unul dintre cele mai frecvente exemple în acest sens este atunci când se creează funcții de temporizare.

Să vedem exemplul de mai jos despre modul în care generatoarele se pot dovedi utile pentru apelurile de apel.

Exemplul nostru va crea doar o funcție simplă de întârziere. Am dori apoi să apelăm această funcție încorporând o întârziere de 1000, 2000 și 3000 ms.

Pasul 1) Definiți funcția noastră de apel invers cu codul de întârziere necesar.

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

Cod Explicație: -

  1. Aici creăm o funcție numită Timedelay cu un parametru numit ptime. Acest lucru va dura întârzierea necesară pe care dorim să o introducem în aplicația noastră.
  2. Următorul pas este să creați doar un mesaj, care va fi afișat utilizatorului spunând că aplicația va fi întreruptă pentru aceste numeroase milisecunde.

Pasul 2) Să vedem acum codul dacă încorporăm apeluri de apel. Să presupunem că am vrut să încorporăm apeluri de apel bazate pe valoarea de 1000, 2000 și 3000 de milisecunde, codul de mai jos arată cum ar trebui să le implementăm folosind apeluri de apel.

Timedelay(1000, function(message) {console.log(msg);Timedelay(2000, function(message) {console.log(msg);Timedelay(3000, function(message) {console.log(msg);})})})

Cod Explicație: -

  1. Apelăm Timedelay ca callback cu 1000 ca valoare.
  2. Apoi vrem să apelăm din nou funcția Timedelay cu valoarea 2000 ca valoare.
  3. În cele din urmă, vrem să apelăm din nou funcția Timedelay cu 3000 ca valoare.

Din codul de mai sus, puteți vedea că devine mai dezordonat deoarece vrem să începem să apelăm funcția de mai multe ori.

Pasul 3) Acum să vedem cum să implementăm același cod folosind generatoare. Din codul de mai jos puteți vedea acum cât de simplu a devenit să implementați funcția Timedelay folosind generatoare.

function* Messages() {console,log(yield(Timedelay(1000, function(){})));console,log(yield(Timedelay(2000, function(){})));console,log(yield(Timedelay(3000, function(){})));}

Cod Explicație: -

  1. Mai întâi definim o funcție generator care va fi utilizată pentru a apela funcția noastră Timedelay.
  2. Apelăm la funcția Yield împreună cu funcția Timedelay cu 1000 ca valoare a parametrului.
  3. Apelăm apoi la funcția Yield împreună cu funcția Timedelay cu 2000 ca valoare a parametrului.
  4. În cele din urmă, apelăm funcția Yield împreună cu funcția Timedelay cu 3000 ca valoare a parametrului.

rezumat

Generatoarele pot fi, de asemenea, folosite pentru a atenua problemele legate de apelurile de apel imbricate și pentru a ajuta la eliminarea a ceea ce este cunoscut sub numele de iad de apel invers. Generatoarele sunt utilizate pentru a opri procesarea unei funcții. Acest lucru se realizează prin utilizarea metodei „randament” în funcția asincronă.