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

Code Spiegazione

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

Code Spiegazione

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

Code Spiegazione

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

Code Spiegazione

  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.

Riassumi questo post con: