Еднократна работа на итератори во JavaScript
Секој итератор може да учествува во циклус
само еднаш. Ова е малку неочекувано,
но логично - бидејќи поминатиот итератор
го поставува својот done во false,
што значи дека не може повеќе да се прелистува.
Ајде да се увериме во ова. Нека имаме следниот генератор:
function *func() {
yield 1;
yield 2;
yield 3;
}
Да направиме итератор:
let iter = func();
Да го прелистаме итераторот со еден циклус:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
А сега да го прелистаме итераторот со два циклуси:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // не работи
}
За решавање на проблемот треба за секој нов циклус да се создаде свој итератор:
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
}
Можеме да поедноставиме:
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
Исправете ја грешката, направена во следниот код:
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);
}