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
- 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.
- 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: -
- 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.
- 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.
- È 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.
- 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.
- 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: -
- Qui stiamo creando una funzione chiamata Timedelay con un parametro chiamato ptime. Ciò richiederà il tempo necessario che vogliamo introdurre nella nostra applicazione.
- 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: -
- Stiamo chiamando il Timedelay come una richiamata con 1000 come valore.
- Successivamente vogliamo chiamare di nuovo la funzione Timedelay con 2000 come valore.
- 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: -
- Per prima cosa definiamo una funzione generatore che verrà utilizzata per chiamare la nostra funzione Timedelay.
- Stiamo chiamando la funzione Yield insieme alla funzione Timedelay con 1000 come valore del parametro.
- Chiamiamo quindi la funzione Yield insieme alla funzione Timedelay con 2000 come valore del parametro.
- 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.