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