Iteratorių vienkartinis veikimas JavaScript
Kiekvienas iteratorius gali dalyvauti cikle
tik vieną kartą. Tai šiek tiek netikėtai,
bet logiška - juk praeitas iteratorius
nustato savo done į false,
o tai reiškia, kad daugiau negali būti perrenkamas.
Įsitikinkime tuo. Tarkime, turime šį generatorių:
function *func() {
yield 1;
yield 2;
yield 3;
}
Sukurkime iteratoriu:
let iter = func();
Perrinkime iteratoriu vienu ciklu:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
O dabar perrinkime iteratoriu dviem ciklais:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // neveikia
}
Problemai išspręsti reikia kiekvienam naudam ciklui sukurti savo iteratoriu:
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
}
Galime supaprastinti:
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
Ištaisykite klaidą, padarytą šiame kode:
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);
}