Jednorazová práca iterátorov v JavaScripte

Každý iterátor sa môže zúčastniť cyklu iba raz. Je to trochu nečakané, ale logické - pretože prejdený iterátor nastaví svoje done na false, čo znamená, že už nemôže byť ďalej prechádzaný.

Presvedčme sa o tom. Nech máme nasledujúci generátor:

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

Vytvorme iterátor:

javascriptlet iter = func();

Prejdime iterátor jedným cyklom:

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

A teraz prejdime iterátor dvoma cyklami:

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

Na vyriešenie problému je potrebné pre každý nový cyklus vytvoriť vlastný iterátor:

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
}

Môžeme zjednodušiť:

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

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

Opravte chybu, ktorá bola urobená v nasledujúcom kóde:

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