Iteradores de uso único em JavaScript
Cada iterador pode participar de um loop
apenas uma vez. Isso é um pouco inesperado,
mas faz sentido - pois um iterador que já foi percorrido
define seu done para false,
o que significa que não pode mais ser iterado.
Vamos verificar isso. Suponha que temos o seguinte gerador:
function *func() {
yield 1;
yield 2;
yield 3;
}
Vamos criar um iterador:
let iter = func();
Vamos iterar sobre o iterador com um loop:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
Agora vamos tentar iterar sobre o mesmo iterador com dois loops:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // não funciona
}
Para resolver o problema, é necessário criar um novo iterador para cada novo loop:
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 o erro cometido no seguinte 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);
}