Iteraattorien kertaluontoinen toiminta JavaScriptissä
Jokainen iteraattori voi osallistua silmukkaan
vain kerran. Tämä on hieman odottamatonta,
mutta loogista - loppuun kuljetettu iteraattori
asettaa done-arvonsa false:ksi,
mikä tarkoittaa, että sitä ei voi enää käydä läpi.
Varmistetaan tästä. Olkoon meillä seuraava generaattori:
function *func() {
yield 1;
yield 2;
yield 3;
}
Luodaan iteraattori:
let iter = func();
Käydään iteraattori läpi yhdellä silmukalla:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
Yritetään nyt käydä iteraattori läpi kahdella silmukalla:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // ei toimi
}
Ongelman ratkaisemiseksi tulee jokaiselle uudelle silmukalle luoda oma iteraattori:
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
}
Voimme yksinkertaistaa:
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
Korjaa seuraavassa koodissa tehty virhe:
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);
}