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}.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.