Funcționarea unică a iteratorilor în JavaScript
Fiecare iterator poate participa într-un ciclu
doar o singură dată. Acest lucru este puțin neașteptat,
dar logic - la urma urmei, iteratorul parcurs
își setează done în false,
ceea ce înseamnă că nu mai poate fi iterat.
Să ne convingem de acest lucru. Să presupunem că avem următorul generator:
function *func() {
yield 1;
yield 2;
yield 3;
}
Să creăm un iterator:
let iter = func();
Să iterăm iteratorul cu un ciclu:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
Acum să iterăm iteratorul cu două cicluri:
for (let elem of iter) {
console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
console.log(elem); // nu funcționează
}
Pentru a rezolva problema, pentru fiecare ciclu nou trebuie să creăm propriul 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
}
Putem simplifica:
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
for (let elem of func()) {
console.log(elem); // 1, 2, 3
}
Corectați eroarea comisă în următorul cod:
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);
}