Iteratoru vienreizējā darbība JavaScript
Katrs iterators var piedalīties ciklā
tikai vienu reizi. Tas ir nedaudz negaidīti,
bet loģiski - jo iztīrītais iterators
iestata savu done uz false,
kas nozīmē, ka tas vairs nevar tikt iterēts.
Pārliecināsimies par to. Pieņemsim, ka mums ir šāds ģenerators:
function *func() {
yield 1;
yield 2;
yield 3;
}
Izveidosim iteratoru:
let iter = func();
Iziterēsim iteratoru ar vienu ciklu:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
Tagad iziterēsim iteratoru ar diviem cikliem:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // nedarbojas
}
Lai atrisinātu problēmu, katram jaunam ciklam ir jāizveido savs iterators:
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
}
Varam vienkāršot:
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
Izlabojiet kļūdu, kas pieļauta sekojošajā 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);
}