A generátorok olyan függvények, amelyekből ki lehet lépni, majd később újra belépni. A kontextusuk (változókötésük) az újbóli belépések során is megmarad.
A generátorok JavaScriptben — különösen Promises-szel kombinálva — nagyon hatékony eszközei az aszinkron programozásnak, mivel enyhítik — ha nem is teljesen kiküszöbölik — a visszahívásokkal kapcsolatos problémákat, mint például a Callback Hell és az Inversion of Control. Ezekre a problémákra azonban még egyszerűbb megoldás is elérhető az aszinkron függvényekkel.
A generátorfüggvény meghívása nem hajtja végre azonnal a testét; helyette egy iterátorobjektumot kapunk vissza a függvényhez. Az iterátor next()
metódusának meghívásakor a generátorfüggvény teste az első yield
kifejezésig végrehajtódik, amely megadja az iterátorból visszaadandó értéket, vagy yield*
segítségével delegál egy másik generátorfüggvényhez. A next()
metódus egy objektumot ad vissza egy value
tulajdonsággal, amely a kiadott értéket tartalmazza, és egy done
tulajdonsággal, amely boolean értékként jelzi, hogy a generátor kiadta-e az utolsó értéket. A next()
metódus meghívása egy argumentummal újraindítja a generátorfüggvény végrehajtását, és a yield
kifejezés, ahol a végrehajtás szünetelt, a next()
argumentummal helyettesíti.
A generátorban lévő return
utasítás végrehajtásakor a generátor befejeződik (azaz az általa visszaadott objektum done
tulajdonsága true
értékű lesz). Ha egy értéket ad vissza, az a generátor által visszaadott objektum value
tulajdonságaként lesz beállítva.
Az return
utasításhoz hasonlóan egy generátoron belül dobott hiba is befejezi a generátort — kivéve, ha a generátor testén belül elkapják.
Amikor egy generátor befejeződik, a későbbi next()
hívások nem fogják végrehajtani a generátor kódját, csak egy ilyen formájú objektumot fognak visszaadni: {value: undefined, done: true}
.