Generators zijn functies die kunnen worden verlaten en later weer kunnen worden uitgevoerd. Hun context (variabele bindingen) worden opgeslagen over re-entrances.
Generators in JavaScript — vooral wanneer gecombineerd met Promises — zijn een zeer krachtig hulpmiddel voor asynchroon programmeren omdat ze de problemen met callbacks, zoals Callback Hell en Inversion of Control, verminderen — zo niet geheel elimineren. Echter, een nog eenvoudiger oplossing voor deze problemen kan worden bereikt met async functies.
Het aanroepen van een generator functie voert zijn body niet onmiddellijk uit; een iterator object voor de functie wordt in plaats daarvan teruggegeven. Wanneer de next()
methode van de iterator wordt aangeroepen, wordt de body van de generator functie uitgevoerd tot de eerste yield
expressie, die de waarde specificeert die moet worden geretourneerd van de iterator of, met yield*
, delegeert naar een andere generator functie. De methode next()
retourneert een object met een value
eigenschap die de opgeleverde waarde bevat en een done
eigenschap die aangeeft of de generator zijn laatste waarde heeft opgeleverd, als een boolean. Door de methode next()
met een argument aan te roepen, wordt de uitvoering van de generatorfunctie hervat, waarbij de yield
-expressie waar de uitvoering was gepauzeerd, wordt vervangen door het argument van next()
.
Een return
-instructie in een generator zal, wanneer deze wordt uitgevoerd, de generator doen eindigen (d.w.z. de done
-eigenschap van het daardoor geretourneerde object zal worden ingesteld op true
). Als een waarde wordt geretourneerd, zal deze worden ingesteld als de value
eigenschap van het object dat door de generator wordt geretourneerd.
Zoals een return
statement, zal een fout die in de generator wordt gegooid de generator afmaken — tenzij deze wordt opgevangen binnen de body van de generator.
Wanneer een generator is beëindigd, zullen volgende next()
aanroepen geen code van die generator uitvoeren, zij zullen slechts een object van deze vorm retourneren: {value: undefined, done: true}
.