Funcionamiento único de los iteradores en JavaScript
Cada iterador puede participar en un ciclo
solo una vez. Esto es un poco inesperado,
pero lógico - después de todo, el iterador recorrido
establece su done en false,
lo que significa que ya no se puede iterar más.
Asegurémonos de esto. Supongamos que tenemos el siguiente generador:
function *func() {
yield 1;
yield 2;
yield 3;
}
Hagamos un iterador:
let iter = func();
Iteremos el iterador con un ciclo:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
Y ahora iteremos el iterador con dos ciclos:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // no funciona
}
Para resolver el problema, es necesario para cada nuevo ciclo crear su propio iterador:
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
}
Podemos simplificar:
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
Corrija el error cometido en el siguiente código:
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);
}