Generatori di Node.js e amp; Confronta con le richiamate

Sommario:

Anonim

In questo tutorial, impareremo a conoscere i generatori e le loro differenze con i callback

Cosa sono i generatori?

I generatori sono diventati abbastanza famosi in Node.js negli ultimi tempi e probabilmente per quello che sono in grado di fare.

  • I generatori sono esecuzioni di funzioni che possono essere sospese e riprese in un secondo momento.
  • I generatori sono utili quando si realizzano concetti come "esecuzione lenta". Ciò significa fondamentalmente che sospendendo l'esecuzione e riprendendo a piacimento, siamo in grado di estrarre i valori solo quando necessario.

I generatori hanno i seguenti 2 metodi chiave

  1. Metodo di rendimento - Il metodo di rendimento viene chiamato in una funzione per interrompere l'esecuzione della funzione nella riga specifica in cui viene chiamato il metodo di rendimento.
  2. Metodo successivo: questo metodo viene chiamato dall'applicazione principale per riprendere l'esecuzione di una funzione che ha un metodo di rendimento. L'esecuzione della funzione continuerà fino al prossimo metodo di rendimento 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 Aggiungi che aggiungerà 2 numeri, ma continueremo a interrompere l'esecuzione del metodo in punti diversi per mostrare come possono essere usati i generatori.

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

Spiegazione del codice: -

  1. Il primo passo è definire la "funzione" del nostro generatore. Nota che questo viene fatto aggiungendo un "*" alla parola chiave function. Stiamo quindi definendo una funzione chiamata Aggiungi che accetta un parametro di x.
  2. La parola chiave yield è specifica per i generatori. Questo lo rende un potente costrutto per mettere in pausa una funzione nel mezzo di qualsiasi cosa. Quindi qui, l'esecuzione della funzione verrà interrotta fino a quando 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 che chiamiamo per la prima volta la funzione del generatore e inviamo il valore di 5 alla nostra funzione Aggiungi. Questo valore verrà sostituito nel parametro x della nostra funzione Aggiungi.
  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 di nuovo la funzione next (), verranno eseguite le istruzioni successive e il valore combinato di x = 5 e y = 6 verrà aggiunto e restituito.

Callback contro generatori

I generatori vengono utilizzati per risolvere il problema di ciò che è noto come l'inferno di richiamata. A volte le funzioni di callback diventano così nidificate durante lo sviluppo di un'applicazione Node.js che diventa troppo complicato usare le funzioni di callback.

È qui che i generatori sono utili. Uno degli esempi più comuni di questo è quando si creano funzioni timer.

Vediamo l'esempio seguente di come i generatori possono rivelarsi utili sui callback.

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

Passaggio 1) Definisci la nostra funzione di richiamata con il codice di ritardo necessario.

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 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 sarà in pausa per questi molti numeri di millisecondi.

Passaggio 2) Ora esaminiamo il codice se stessimo incorporando i callback. Supponiamo di voler incorporare i callback basati sul valore di 1000, 2000 e 3000 millisecondi, il codice seguente mostra come avremmo bisogno di implementarli utilizzando i callback.

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. Stiamo chiamando il Timedelay come una richiamata con 1000 come valore.
  2. Successivamente vogliamo chiamare di nuovo la funzione Timedelay con 2000 come valore.
  3. Infine, vogliamo richiamare di nuovo 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.

Passaggio 3) Ora vediamo come implementare lo stesso codice utilizzando i generatori. Dal codice sottostante puoi ora vedere quanto sia diventato semplice implementare la funzione Timedelay utilizzando i generatori.

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. Stiamo chiamando la funzione Yield insieme alla funzione Timedelay con 1000 come valore del parametro.
  3. Chiamiamo quindi la funzione Yield insieme alla funzione Timedelay con 2000 come valore del parametro.
  4. Infine, stiamo chiamando la funzione Yield insieme alla funzione Timedelay con 3000 come valore del parametro.

Sommario

I generatori possono essere utilizzati anche per alleviare i problemi con i callback annidati e assistere nella rimozione di quello che è noto come l'inferno di callback. I generatori vengono utilizzati per interrompere l'elaborazione di una funzione. Ciò si ottiene utilizzando il metodo "yield" nella funzione asincrona.