Iteraattorien kertaluontoinen toiminta JavaScriptissä

Jokainen iteraattori voi osallistua silmukkaan vain kerran. Tämä on hieman odottamatonta, mutta loogista - loppuun kuljetettu iteraattori asettaa done-arvonsa false:ksi, mikä tarkoittaa, että sitä ei voi enää käydä läpi.

Varmistetaan tästä. Olkoon meillä seuraava generaattori:

javascriptfunction *func() {
  yield 1;
  yield 2;
  yield 3;
}

Luodaan iteraattori:

javascriptlet iter = func();

Käydään iteraattori läpi yhdellä silmukalla:

javascriptfor (let elem of iter) {
  console.log(elem); // 1, 2, 3
}

Yritetään nyt käydä iteraattori läpi kahdella silmukalla:

javascriptfor (let elem of iter) {
  console.log(elem); // 1, 2, 3
}
for (let elem of iter) {
  console.log(elem); // ei toimi
}

Ongelman ratkaisemiseksi tulee jokaiselle uudelle silmukalle luoda oma iteraattori:

javascriptlet 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
}

Voimme yksinkertaistaa:

javascriptfor (let elem of func()) {
  console.log(elem); // 1, 2, 3
}

for (let elem of func()) {
  console.log(elem); // 1, 2, 3
}
Задание 1

Korjaa seuraavassa koodissa tehty virhe:

javascriptfunction *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);
}