Generatorit ovat funktioita, joista voidaan poistua ja joihin voidaan myöhemmin palata. Niiden konteksti (muuttujien sidonnat) tallentuvat uudelleentulon aikana.

Generaattorit JavaScriptissä — erityisesti yhdistettynä Promisesiin — ovat erittäin tehokas työkalu asynkronisessa ohjelmoinnissa, koska ne lieventävät — joskaan eivät kokonaan poista — takaisinkutsuihin liittyviä ongelmia, kuten Callback Hell (takaisinkutsuhelvetti) ja Inversion of Control (kontrollin kääntäminen). Vielä yksinkertaisempi ratkaisu näihin ongelmiin voidaan kuitenkin saavuttaa asynkronisilla funktioilla.

Kutsumalla generaattorifunktiota sen runkoa ei suoriteta välittömästi, vaan sen sijaan palautetaan funktion iteraattoriobjekti. Kun iteraattorin next()-metodia kutsutaan, generaattorifunktion runko suoritetaan ensimmäiseen yield-lausekkeeseen asti, joka määrittää iteraattorista palautettavan arvon tai yield*:llä delegoi toiselle generaattorifunktiolle. Metodi next() palauttaa objektin, jolla on value-ominaisuus, joka sisältää tuotetun arvon, ja done-ominaisuus, joka ilmoittaa boolean-arvona, onko generaattori tuottanut viimeisen arvonsa. Metodin next() kutsuminen argumentin kanssa jatkaa generaattorifunktion suoritusta ja korvaa yield-lausekkeen, jossa suoritus keskeytettiin, next()-argumentilla.

A return-lauseke generaattorissa saa suoritettuna generaattorin päättymään (eli sen palauttaman objektin done-ominaisuus asetetaan true:ksi). Jos arvo palautetaan, se asetetaan generaattorin palauttaman objektin value-ominaisuudeksi.
Kuten return-lauseen tapaan, generaattorin sisällä heitetty virhe tekee generaattorin valmiiksi — ellei sitä oteta kiinni generaattorin rungossa.
Kun generaattori on valmis, myöhemmät next()-kutsut eivät suorita mitään kyseisen generaattorin koodista, vaan ne vain palauttavat tämän muotoisen objektin: {value: undefined, done: true}.

Vastaa

Sähköpostiosoitettasi ei julkaista.