Node.js Generators & Confronta con richiamate

In questo tutorial impareremo a conoscere Generatore le loro differenze con i callback

Cosa sono i generatori?

Generatorsono diventati piuttosto famosi in Node.js negli ultimi tempi e ciò è probabilmente dovuto a ciò che sono capaci di fare.

  • Generatorsono esecuzioni di funzioni che possono essere sospese e riprese in un secondo momento.
  • Generatorsono utili quando si eseguono concetti come "esecuzione lenta". Ciò significa sostanzialmente che sospendendo l'esecuzione e riprendendola a piacimento, siamo in grado di estrarre valori solo quando necessario.

GeneratorAbbiamo i 2 metodi chiave seguenti.

  1. Metodo di rendimento – Il metodo yield viene chiamato in una funzione per arrestare l'esecuzione della funzione sulla riga specifica in cui viene chiamato il metodo yield.
  2. Metodo successivo – Questo metodo viene chiamato dall'applicazione principale per riprendere l'esecuzione di una funzione che ha un metodo yield. L'esecuzione della funzione continuerà fino al successivo metodo yield o fino alla fine del metodo.

Diamo un'occhiata a un esempio di come possono essere utilizzati i generatori.

Nel nostro esempio, avremo una semplice funzione Add che aggiungerà 2 numeri, ma continueremo a interrompere l'esecuzione del metodo in diversi punti per mostrare come possono essere utilizzati i generatori.

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(); 

Spiegazione del codice

  1. Il primo passo è definire la nostra "funzione" del generatore. Nota che questo si fa aggiungendo un "*" alla parola chiave funzione. Stiamo quindi definendo una funzione chiamata Add che accetta un parametro di x.
  2. La parola chiave yield è specifica dei generatori. Ciò la rende un potente costrutto per mettere in pausa una funzione nel mezzo di qualsiasi cosa. Quindi, qui, l'esecuzione della funzione verrà interrotta finché non invochiamo la funzione next(), che verrà eseguita nel passaggio 4. A questo punto, il valore di x diventerà 6 e l'esecuzione della funzione verrà interrotta.
  3. Qui è dove chiamiamo per la prima volta la funzione generatore e inviamo il valore 5 alla nostra funzione Add. Questo valore verrà sostituito nel parametro x della nostra funzione Add.
  4. Una volta chiamata la funzione next(), la funzione Add() riprenderà l'esecuzione. Quando verrà eseguita l'istruzione successiva var y= yield(null), la funzione Add() interromperà nuovamente l'esecuzione.
  5. Ora, dopo aver chiamato nuovamente la funzione next(), verranno eseguite le istruzioni successive e verrà aggiunto e restituito il valore combinato di x=5 e y=6.

Richiami contro generatori

Generatorvengono utilizzati per risolvere il problema di ciò che è noto come callback hell. A volte le funzioni di callback diventano così annidate durante lo sviluppo di un'applicazione Node.js che diventa troppo complicato utilizzare le funzioni di callback.

Ecco dove i generatori sono utili. Uno degli esempi più comuni è quando si creano funzioni timer.

Di seguito è riportato un esempio di come i generatori possano rivelarsi utili rispetto ai callback.

Il nostro esempio creerà semplicemente una semplice funzione di ritardo temporale. Vorremmo quindi chiamare questa funzione incorporando un ritardo di 1000, 2000 e 3000 ms.

Passo 1) Definisci la nostra funzione di callback con il codice di ritardo temporale necessario.

Richiamate vs. Generators

function Timedelay(ptime, callback) {

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

Spiegazione del codice

  1. Qui stiamo creando una funzione chiamata Timedelay con un parametro chiamato ptime. Ciò richiederà il ritardo di tempo necessario che vogliamo introdurre nella nostra applicazione.
  2. Il passaggio successivo è semplicemente creare un messaggio, che verrà visualizzato all'utente dicendo che l'applicazione verrà messa in pausa per questi numeri di millisecondi.

Passo 2) Ora diamo un'occhiata al codice se stessimo incorporando i callback. Supponiamo di voler incorporare callback in base al valore di 1000, 2000 e 3000 millisecondi, il codice seguente mostra come dovremmo implementarli utilizzando i callback.

Richiamate vs. Generators

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

Spiegazione del codice

  1. Chiameremo Timedelay come callback con 1000 come valore.
  2. Successivamente vogliamo chiamare nuovamente la funzione Timedelay con 2000 come valore.
  3. Infine, vogliamo richiamare nuovamente la funzione Timedelay con 3000 come valore.

Dal codice sopra, puoi vedere che diventa più complicato poiché vogliamo iniziare a chiamare la funzione più volte.

Passo 3) Ora vediamo come implementare lo stesso codice usando i generatori. Dal codice sottostante puoi vedere quanto è diventato semplice implementare la funzione Timedelay usando i generatori.

Richiamate vs. Generators

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

Spiegazione del codice

  1. Per prima cosa definiamo una funzione generatore che verrà utilizzata per chiamare la nostra funzione Timedelay.
  2. Chiameremo la funzione Yield insieme alla funzione Timedelay con 1000 come valore del parametro.
  3. Chiameremo quindi la funzione Yield insieme alla funzione Timedelay con 2000 come valore del parametro.
  4. Infine, chiameremo la funzione Yield insieme alla funzione Timedelay con 3000 come valore del parametro.

Sintesi

Generators può anche essere usato per alleviare i problemi con i callback annidati e aiutare a rimuovere quello che è noto come l'inferno dei callback. Generators vengono utilizzati per interrompere l'elaborazione di una funzione. Ciò si ottiene tramite l'utilizzo del metodo 'yield' nella funzione asincrona.