Jednorázová práce iterátorů v JavaScriptu
Každý iterátor se může účastnit cyklu
pouze jednou. To je trochu neočekávané,
ale logické - protože provedený iterátor
nastaví své done na false,
a tedy již nemůže být dále procházen.
Přesvědčme se o tom. Předpokládejme, že máme následující generátor:
function *func() {
yield 1;
yield 2;
yield 3;
}
Vytvořme iterátor:
let iter = func();
Projděme iterátor jedním cyklem:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
Nyní projděme iterátor dvěma cykly:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // nefunguje
}
Pro řešení problému je potřeba pro každý nový cyklus vytvořit vlastní iterátor:
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
}
Můžeme zjednodušit:
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
Opravte chybu, které bylo dopuštěno v následujícím kódu:
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);
}