Un generatore è una funzione che può mettersi in pausa e riprendere, producendo valori uno alla volta con yield.
function* contatore() {
let n = 1;
while (true) {
yield n++; // produce un valore e si ferma qui
}
}
const gen = contatore();
gen.next().value; // 1
gen.next().value; // 2
// sequenza infinita, ma calcolata su richiesta
function* primiN(n) {
for (let i = 0; i < n; i++) yield i * i;
}
[...primiN(4)]; // [0, 1, 4, 9]
Ogni next() esegue fino al prossimo yield e si ferma, ricordando lo stato. Questo permette sequenze infinite ma pigre: calcoli un valore solo quando lo chiedi.
Sono la base degli iteratori personalizzati e delle librerie di streaming di dati. Un concetto di nicchia, ma quando serve (dati infiniti, pipeline lazy) non ha rivali per eleganza.