Un generatore in JavaScript è un tipo speciale di funzione che funziona come un iteratore. I generatori possono essere fermati e ripresi, mantenendo il loro contesto (valore di variabile) tra le esecuzioni. Ciò significa che i generatori possono generare una serie di valori su richiesta, invece di calcolarli tutti in anticipo e tenerli in memoria.
Ecco come utilizzare i generatori in JavaScript:
1. Creare un generatore:
Prima di tutto, dobbiamo creare una funzione generatore. Si tratta di una funzione preceduta da un asterisco (\*) e utilizza la parola chiave “yield”.
```
function* myGenerator() {
yield ‘valore 1’;
yield ‘valore 2’;
yield ‘valore 3’;
}
```
In questo esempio, il nostro generatore restituirà ‘valore 1’, ‘valore 2’, e ‘valore 3’ in questo ordine.
1. Utilizzare un generatore:
Ora che abbiamo un generatore, possiamo utilizzarlo nel nostro codice. Creiamo una nuova istanza del generatore e utilizziamo il metodo next() per ottenere il prossimo valore.
```
var gen = myGenerator();
console.log(gen.next().value); // valore 1
console.log(gen.next().value); // valore 2
console.log(gen.next().value); // valore 3
```
Quando si chiama la funzione next(), il generatore riprende l’esecuzione dal punto in cui si è interrotta l’ultima volta. Quando non ci sono più valori da restituire, next() restituirà un oggetto con un valore indefinito e un flag done impostato a true.
1. Usare i generatori con il ciclo for…of:
Un altro modo per utilizzare i generatori in JavaScript è con un ciclo for…of. Questo ciclo itera automaticamente attraverso i valori del generatore.
```
for(let value of myGenerator()) {
console.log(value); // valore 1, valore 2, valore 3
}
```
In questo esempio, il ciclo for…of chiama il generatore, chiama il metodo next() ad ogni iterazione, e si ferma quando non ci sono più valori da generare.+
Inoltre, i generatori possono anche ricevere l’input tramite il metodo next(). Questo input diventa il risultato dell’espressione yield corrispondente. Per utilizzare questa caratteristica, è possibile passare un parametro al metodo next():
```
function* myGenerator() {
let received = yield ‘valore 1’;
console.log(received); // ‘ciao‘
}
let gen = myGenerator();
console.log(gen.next().value); // ‘valore 1‘
console.log(gen.next(‘ciao’)); // {value: undefined, done: true}
```
In questo esempio, la stringa ‘ciao’ viene passata al metodo next() come un parametro, e viene quindi stampata dalla funzione generatore.