Funzionamento singolo degli iteratori in JavaScript
Ogni iteratore può partecipare in un ciclo
solo una volta. È un po' inaspettato,
ma logico - dopotutto, un iteratore esaurito
imposta il suo done su false,
il che significa che non può più essere iterato.
Verifichiamolo. Supponiamo di avere il seguente generatore:
function *func() {
yield 1;
yield 2;
yield 3;
}
Creiamo un iteratore:
let iter = func();
Iteriamo l'iteratore con un ciclo:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
Ora iteriamo l'iteratore con due cicli:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // non funziona
}
Per risolvere il problema, per ogni nuovo ciclo è necessario creare un proprio iteratore:
let iter1 = func();
for (let elem of iter1) {
console.log(elem); // 1, 2, 3
}
let iter2 = func();
for (let elem of iter2) {
console.log(elem); // 1, 2, 3
}
Possiamo semplificare:
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
Correggi l'errore commesso nel seguente codice:
function *func() {
for (let i = 1; i <= 3; i++) {
yield i;
}
}
let elems = func();
for (let elem of elems) {
console.log(elem);
}
for (let elem of elems) {
console.log(elem);
}