Generatorer är funktioner som kan avslutas och senare startas igen. Deras kontext (variabelbindningar) sparas över re-entrances.
Generatorer i JavaScript — särskilt när de kombineras med Promises — är ett mycket kraftfullt verktyg för asynkron programmering eftersom de mildrar — om inte helt eliminerar — problemen med callbacks, såsom Callback Hell och Inversion of Control. En ännu enklare lösning på dessa problem kan dock uppnås med asynkrona funktioner.
Att anropa en generatorfunktion exekverar inte dess kropp omedelbart; ett iteratorobjekt för funktionen returneras istället. När iteratorns next()
metod anropas exekveras generatorfunktionens kropp fram till det första yield
-uttrycket, som anger det värde som ska returneras från iteratorn eller, med yield*
, delegerar till en annan generatorfunktion. next()
-metoden returnerar ett objekt med en value
-egenskap som innehåller det avgivna värdet och en done
-egenskap som anger om generatorn har avgivit sitt sista värde, i form av en boolean. Om metoden next()
anropas med ett argument återupptas utförandet av generatorfunktionen och yield
-uttrycket där utförandet pausades ersätts med argumentet från next()
.
Ett return
-uttalande i en generator gör, när det utförs, att generatorn avslutas (dvs. done
-egenskapen för objektet som returneras av det kommer att sättas till true
). Om ett värde returneras kommer det att sättas som value
-egenskapen för objektet som returneras av generatorn.
Som ett return
-uttalande kommer ett fel som kastas i generatorn att göra generatorn avslutad – om det inte fångas upp i generatorns kropp.
När en generator är avslutad kommer efterföljande next()
-anrop inte att exekvera någon av generatorns kod, utan de kommer bara att returnera ett objekt av den här formen: {value: undefined, done: true}
.