Generatorer er funktioner, der kan afsluttes og senere genåbnes. Deres kontekst (variabelbindinger) gemmes på tværs af re-entrances.

Generatorer i JavaScript — især når de kombineres med Promises — er et meget kraftfuldt værktøj til asynkron programmering, da de afbøder — om ikke helt eliminerer — problemerne med callbacks, såsom Callback Hell og Inversion of Control. Der kan dog opnås en endnu enklere løsning på disse problemer med asynkrone funktioner.

Kaldes en generatorfunktion, udføres dens krop ikke straks; der returneres i stedet et iteratorobjekt for funktionen. Når iteratorens next() metode kaldes, udføres generatorfunktionens krop indtil det første yield udtryk, som angiver den værdi, der skal returneres fra iteratoren, eller som med yield* delegerer til en anden generatorfunktion. next()-metoden returnerer et objekt med en value-egenskab, der indeholder den afgivne værdi, og en done-egenskab, der angiver, om generatoren har afleveret sin sidste værdi, som et boolean. Ved at kalde next()-metoden med et argument genoptages udførelsen af generatorfunktionen, idet yield-udtrykket, hvor en udførelse blev sat på pause, erstattes med argumentet fra next().

En return-anvisning i en generator vil, når den udføres, få generatoren til at afslutte (dvs. done-egenskaben for det objekt, der returneres af den, vil blive sat til true). Hvis der returneres en værdi, vil den blive sat som value-egenskaben for det objekt, der returneres af generatoren.
Som en return-anvisning vil en fejl, der kastes inde i generatoren, gøre generatoren færdig – medmindre den opfanges i generatorens krop.
Når en generator er færdig, vil efterfølgende next()-opkald ikke udføre noget af den pågældende generators kode, de vil blot returnere et objekt af denne form: {value: undefined, done: true}.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.