Node.js Generators & Comparați cu apelurile inverse

În acest tutorial, vom învăța despre Generators și diferențele lor cu apelurile inverse

Ce sunt generatoarele?

Generatorau devenit destul de faimoase în Node.js în ultima vreme și asta se datorează probabil a ceea ce sunt capabili să facă.

  • Generators sunt execuții de funcții care pot fi suspendate și reluate la un moment ulterior.
  • Generatorsunt utile atunci când se realizează concepte precum „execuție leneșă”. Acest lucru înseamnă, practic, că prin suspendarea execuției și reluarea după bunul plac, suntem capabili să tragem valori doar atunci când avem nevoie.

Generatorau următoarele 2 metode cheie.

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

Să ne uităm la un exemplu despre cum pot fi utilizate generatoarele.

În exemplul nostru, vom avea o funcție simplă Adaugă 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.

Node.js Generators

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

var gen = Add(5);

gen.next();

gen.next(); 

Explicarea codului

  1. Primul pas este să definim „funcția” generatorului nostru. Rețineți că acest lucru se face prin adăugarea unui „*” la cuvântul cheie al funcției. Definim apoi o funcție numită Add care ia un parametru de x.
  2. Cuvântul cheie yield este specific generatorilor. Acest lucru îl face un construct 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 se va face în Pasul 4. În acest moment, valoarea lui x va deveni 6 și execuția funcției va fi oprită.
  3. Aici apelăm mai întâi funcția generator și trimitem valoarea 5 la funcția noastră Add. Această valoare va fi înlocuită în parametrul x al funcției noastre Add.
  4. Odată ce apelăm funcția next(), funcția Add() va relua execuția. Când următoarea instrucțiune var y= yield(null) va fi executată, funcția Add() se va opri din nou.
  5. Acum, după apelarea funcției next() din nou, următoarele instrucțiuni vor rula, iar valoarea combinată a x=5 și y=6 va fi adăugată și returnată.

Reapeluri vs. generatoare

Generators sunt folosite 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ă folosești funcțiile de apel invers.

Aici sunt utile generatoarele. Unul dintre cele mai comune exemple în acest sens este atunci când creați funcții de cronometru.

Să vedem exemplul de mai jos despre modul în care generatoarele se pot dovedi utile în cazul apelurilor inverse.

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

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

Reapeluri vs. Generators

function Timedelay(ptime, callback) {

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

Explicarea codului

  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 un mesaj, care va fi afișat utilizatorului spunând că aplicația va fi întreruptă pentru aceste multe milisecunde.

Pas 2) Acum să ne uităm la cod dacă am încorpora apeluri inverse. Să presupunem că dorim să încorporăm apeluri inverse bazate pe valoarea de 1000, 2000 și 3000 de milisecunde, codul de mai jos arată cum ar trebui să le implementăm folosind apeluri inverse.

Reapeluri vs. Generators

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

Explicarea codului

  1. Apelăm Timedelay ca un apel invers cu 1000 ca valoare.
  2. Apoi vrem să apelăm din nou funcția Timedelay cu 2000 ca valoare.
  3. În cele din urmă, dorim 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.

Pas 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.

Reapeluri vs. Generators

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

Explicarea codului

  1. Mai întâi definim o funcție generatoare care va fi folosită pentru a apela funcția Timedelay.
  2. Apelăm funcția Yield împreună cu funcția Timedelay cu 1000 ca valoare a parametrului.
  3. Apoi apelăm 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

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