Engångsarbete för iteratorer i JavaScript
Varje iterator kan endast delta i en loop
en gång. Detta är lite oväntat,
men logiskt - eftersom en iterator som har gått till slut
sätter sitt done till false,
och därför inte kan itereras mer.
Låt oss se till att det är så. Anta att vi har följande generator:
function *func() {
yield 1;
yield 2;
yield 3;
}
Låt oss skapa en iterator:
let iter = func();
Låt oss iterera över iteratorn med en loop:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
Och nu låt oss iterera över iteratorn med två loopar:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // fungerar inte
}
För att lösa problemet måste du för varje ny loop skapa en ny iterator:
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
}
Vi kan förenkla:
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
Rättaa felet som har gjorts i följande kod:
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);
}