Deo zbornika Napredni Javaskript

Generatori u Javascriptu

Obična funkcija se izvršava liniju po liniju, i zaustavlja kada se poslednja linija izvrši. Međutim, generator funkcija se može zaustaviti i nastaviti.

Generator funkcija se može zaustaviti samo iznutra, pomoću ključne reči yield. Kada se zaustavi, može se ponovo pokrenuti izvana. Možemo zaustaviti i pokrenuti funkciju koliko puta želimo. Generator funkcije omogućavaju i dvosmerno prosleđivanje poruka. Kada zaustavimo funkciju pomoću yield, poruka se šalje van, a kada je ponovo pokrenemo, poruka se šalje nazad u funkciju.

Generatori imaju značajnu ulogu u asinhronom programiranju i mogu nam pomoći da pišemo kooperativne funkcije koje obavljaju više zadataka.

Prost primer

Generator funkcije vraćaju iterator objekat. Zvezdica * nakon reči function označava generator:

function* brojac() {
  yield 1
  yield 2
}

const iterator = brojac()
console.log(iterator.next().value)
console.log(iterator.next().value)
console.log(iterator.next().done)

Generator funkcija se ne izvršava kao obična, već vraća iterator objekat. Kada pozovemo next() sa iteratora, funkcija se izvršava do ključne reči yield. Kad ponovo pozovemo next(), izvršenje se nastavlja od mesta na kome je zaustavljeno. Kada se izvrši cela funkcija, svojstvo done postaje true.

Pauziranje petlje

Generator funkcija nam može poslužiti da pauziramo izvršenje petlje:

function* brojac() {
  for (let i = 0; i < 10; i++) {
    yield i
  }
}

const iterator = brojac()
console.log(iterator.next().value)
console.log(iterator.next().value)
console.log(iterator.next().done)

Beskonačna petlja

Ne moramo se plašiti beskonačne petlje u generator funkciji, jer se ona izvršava korak po korak:

function* brojac() {
  let i = 0
  while(true) {
    yield i++
  }
}

const iterator = brojac()
console.log(iterator.next().value)
console.log(iterator.next().value)
console.log(iterator.next().value)

Literatura

  • Ved Antani, Stojan Stefanov, Objektno-orjentisan JavaScript, Beograd, 2017.