Еднократна работа на итератори в 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);
}