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