Przejdź do głównej zawartości

Bug #089

🪲 Znajdź buga

function* iterate(array) {
let i = 0
while (array.length) {
yield array[i++]
}
}

const array = [1, 2, 3]

console.log(iterate(array).next().value)
console.log(iterate(array).next().value)
console.log(iterate(array).next().value)

Chcemy stworzyć generator, który przy wywołaniu będzie zwracał nam kolejne wartości z tablicy.

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

function* iterate(array) {
let i = 0
while (array.length) {
yield array[i++]
}
}

const array = [1, 2, 3]

const numbersIterator = iterate(array)
console.log(numbersIterator.next().value)
console.log(numbersIterator.next().value)
console.log(numbersIterator.next().value)

W błędnym przykładzie wszystkie trzy wywołania zalogują do konsoli wartość 1.

Funkcja generatora (z gwiazdką *) zwraca obiekt generatora, który możemy iterować wywołując metodę next().

Wywołując funkcję iterate(array), zwrócony zostaje nowy obiekt generatora.

Wywołując wielokrotnie iterate(array).next() za każdym razem dostajemy nowy obiekt, więc wywoływanie na nim metody next() zawsze zwraca tylko pierwszą iterację z tablicy.

Aby to naprawić, musimy zwracany z funkcji obiekt generatora przypisać do stałej (lub zmiennej) i dopiero wtedy wywoływać metody next() na tym obiekcie.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js