In questo tutorial imparerai a conoscere i generatori JavaScript con l'aiuto di esempi.
In JavaScript, i generatori forniscono un nuovo modo di lavorare con funzioni e iteratori.
Utilizzando un generatore,
- puoi interrompere l'esecuzione di una funzione da qualsiasi punto all'interno della funzione
- e continuare a eseguire il codice da una posizione di arresto
Crea generatori JavaScript
Per creare un generatore, è necessario prima definire una funzione generatore con il function*
simbolo. Gli oggetti delle funzioni del generatore sono chiamati generatori.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Nota : la funzione del generatore è indicata da *
. Puoi usarli function* generatorFunc() (… )
o function *generatorFunc()(… )
crearli.
Utilizzo di yield per sospendere l'esecuzione
Come accennato in precedenza, è possibile sospendere l'esecuzione di una funzione del generatore senza eseguire l'intero corpo della funzione. Per questo, usiamo la yield
parola chiave. Per esempio,
// generator function function* generatorFunc() ( console.log("1. code before the first yield"); yield 100; console.log("2. code before the second yield"); yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next());
Produzione
1. codice prima del primo rendimento (valore: 100, fatto: falso)
Qui,
- Viene
generator
creato un oggetto generatore denominato . - Quando
generator.next()
viene chiamato,yield
viene eseguito il codice fino al primo . Quandoyield
viene rilevato, il programma restituisce il valore e sospende la funzione del generatore.
Nota : è necessario assegnare oggetti generatore a una variabile prima di utilizzarla.
Lavorazione di più dichiarazioni di rendimento
L' yield
espressione restituisce un valore. Tuttavia, a differenza return
dell'istruzione, non termina il programma. Ecco perché puoi continuare a eseguire il codice dall'ultima posizione resa. Per esempio,
function* generatorFunc() ( console.log("1. code before first yield"); yield 100; console.log("2. code before the second yield"); yield 200; console.log("3. code after the second yield"); ) const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next()); console.log(generator.next());
Produzione
1. codice prima del primo rendimento (valore: 100, fatto: falso) 2. codice prima del secondo rendimento (valore: 200, fatto: falso) (valore: undefined, fatto: vero)
Ecco come funziona questo programma.
- La prima
generator.next()
istruzione esegue il codice fino alla prima istruzione yield e sospende l'esecuzione del programma. - Il secondo
generator.next()
avvia il programma dalla posizione di pausa. - Quando si accede a tutti gli elementi, restituisce (value: undefined, done: true).

Passaggio di argomenti alle funzioni del generatore
Puoi anche passare argomenti a una funzione di generatore. Per esempio,
// generator function function* generatorFunc() ( // returns 'hello' at first next() let x = yield 'hello'; // returns passed argument on the second next() console.log(x); console.log('some code'); // returns 5 on second next() yield 5; ) const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next(6)); console.log(generator.next());
Produzione
(valore: "ciao", fatto: falso) 6 codice (valore: 5, fatto: falso) (valore: undefined, fatto: vero)
Nel programma sopra,
- Il primo
generator.next()
restituisce il valore diyield
(in questo caso, 'ciao'). Tuttavia, il valore non è assegnato alla variabile x inlet x = yield 'hello';
(valore: "ciao", fatto: falso)
- Quando
generator.next(6)
viene incontrato, il codice ricomincia dalet x = yield 'hello';
e l'argomento 6 viene assegnato a x. Inoltre, il codice rimanente viene eseguito fino al secondoyield
.6 codice (valore: 5, fatto: falso)
- Quando il terzo
next()
viene eseguito, il programma restituisce (valore: undefined, done: true). È perché non ci sono altre dichiarazioni di rendimento.(valore: undefined, done: true)
I generatori vengono utilizzati per implementare gli iterabili
I generatori forniscono un modo più semplice per implementare gli iteratori.
Se vuoi implementare un iteratore manualmente, devi creare un iteratore con il next()
metodo e salvare lo stato. Per esempio,
// creating iterable object const iterableObj = ( // iterator method (Symbol.iterator)() ( let step = 0; return ( next() ( step++; if (step === 1) ( return ( value: '1', done: false); ) else if (step === 2) ( return ( value: '2', done: false); ) else if (step === 3) ( return ( value: '3', done: false); ) return ( value: '', done: true ); ) ) ) ) for (const i of iterableObj) ( console.log(i); )
Produzione
1 2 3
Poiché i generatori sono iterabili, è possibile implementare un iteratore in un modo più semplice. Quindi puoi scorrere i generatori usando il for… of
ciclo. Per esempio,
// generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )
Metodi del generatore
Metodo | Descrizione |
---|---|
next() | Restituisce un valore di rendimento |
return() | Restituisce un valore e termina il generatore |
throw() | Genera un errore e termina il generatore |
JavaScript return vs yield parola chiave
parola chiave di ritorno | parola chiave di rendimento |
---|---|
Restituisce il valore e termina la funzione. | Restituisce il valore e arresta la funzione ma non termina la funzione. |
Disponibile sia nelle funzioni normali che in quelle del generatore. | Disponibile solo nelle funzioni generatore. |
Funzione generatore JavaScript con ritorno
You can use the return
statement in a generator function. The return
statement returns a value and terminates the function (similar to regular functions). For example,
// generator function function* generatorFunc() ( yield 100; return 123; console.log("2. some code before second yield"); yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next()); console.log(generator.next());
Output
(value: 100, done: false) (value: 123, done: true) (value: undefined, done: true)
In the above program, when the return
statement is encountered, it returns the value and done
property becomes true
, and the function terminates. Hence, the next()
method after the return
statement does not return anything.
Note: You can also use the return()
method instead of the return
statement like generator.return(123);
in the above code.
JavaScript Generator Throw Method
Puoi generare esplicitamente un errore sulla funzione del generatore utilizzando il metodo throw (). L'uso del throw()
metodo genera un errore e termina la funzione. Per esempio,
// generator function function* generatorFunc() ( yield 100; yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next()); // throws an error // terminates the generator console.log(generator.throw(new Error('Error occurred.'))); console.log(generator.next());
Produzione
(valore: 1, fatto: falso) Errore: si è verificato un errore.
Usi dei generatori
- I generatori ci consentono di scrivere codice più pulito durante la scrittura di attività asincrone.
- I generatori forniscono un modo più semplice per implementare gli iteratori.
- I generatori eseguono il codice solo quando richiesto.
- I generatori sono efficienti in termini di memoria.
I generatori sono stati introdotti in ES6 . Alcuni browser potrebbero non supportare l'uso dei generatori. Per saperne di più, visita il supporto di JavaScript Generators.