A Simple Guide to Understanding Javascript (ES6) Generators
Rajesh Babu
Follow
május 4, 2018 – 9 min read
Ha az elmúlt két-öt évben JavaScript fejlesztő voltál, akkor biztosan találkoztál olyan posztokkal, amelyek a generátorokról és az iterátorokról szóltak. Bár a generátorok és az Iterátorok eredendően összefüggnek, a generátorok egy kicsit félelmetesebbnek tűnnek, mint a másik.
Az Iterátorok az Iterable objektumok, például térképek, tömbök és karakterláncok olyan implementációja, amely lehetővé teszi számunkra, hogy a next() segítségével iteráljuk őket. Sokféle felhasználási esetük van a generátorok, az Observables és a Spread operátorok között.
Azoknak, akiknek újak az iterátorok, az alábbi linket ajánlom: Guide to Iterators.
Hogy ellenőrizze, hogy az objektum megfelel-e az iterable protokollnak, ellenőrizze a beépített Symbol.iterator segítségével:
Az ES6 részeként bevezetett generátorok nem változtak a további JavaScript kiadásokban, és tovább maradnak itt. Úgy értem, tényleg sokáig! Tehát nincs menekvés előle. Bár az ES7 és az ES8 tartalmaz néhány új frissítést, ezek nem rendelkeznek olyan mértékű változással, mint az ES6 az ES5-höz képest, amely úgymond a következő szintre emelte a JavaScriptet.
Az írás végére biztos vagyok benne, hogy a függvénygenerátorok működésének alapos megértésével rendelkezni fogsz. Ha profi vagy, kérlek, segíts a tartalom javításában azzal, hogy a hozzászólásaidat a válaszok között teszed meg. Arra az esetre, ha nehezen tudnád követni a kódot, a legtöbb kódhoz magyarázatot is adtam, hogy jobban megértsd.
A JavaScriptben a függvények, mint tudjuk, “addig futnak, amíg vissza nem térnek/véget nem érnek”. A generátorfüggvények viszont “addig futnak, amíg yield/return/end”. A normál függvényektől eltérően a Generator Functions meghívás után visszaadja a Generator Object-et, amely a teljes Generator Iterable-t tartalmazza, amelyet a next() metódus vagy a for…of ciklus segítségével iterálhatunk.
A generátor minden next() hívása minden egyes kódsort végrehajt a következő yield-ig, amellyel találkozik, és ideiglenesen felfüggeszti a végrehajtást.
Szintaktikailag egy *-gal azonosítják őket, vagy függvény* X vagy függvény *X, – mindkettő ugyanazt jelenti.
A generátor függvény meghívása után a generátor objektumot adja vissza. Ezt a generátor objektumot egy változóhoz kell rendelni, hogy nyomon követhessük a rajta meghívott későbbi next() metódusokat. Ha a generátor objektumot nem rendeljük változóhoz, akkor mindig csak az első yield kifejezésig adódik minden next() esetén.
A generátor függvények általában yield kifejezésekkel épülnek fel. Minden yield a generátorfüggvényen belül egy megállási pont a következő végrehajtási ciklus megkezdése előtt. Az egyes végrehajtási ciklusokat a generátor next() metódusával indítjuk el.
A yield kifejezés minden next() híváskor visszaadja az értékét egy objektum formájában, amely a következő paramétereket tartalmazza.
{ value: 10, done: false } // assuming that 10 is the value of yield
Érték – minden, ami a yield kulcsszó jobb oldalára van írva, ez lehet függvényhívás, objektum vagy gyakorlatilag bármi. Üres yield esetén ez az érték meghatározatlan.
Done – a generátor állapotát jelzi, hogy a továbbiakban végrehajtható-e vagy sem. Ha a done true-t ad vissza, az azt jelenti, hogy a függvény befejezte a futását.
(Ha úgy érzi, hogy ez egy kicsit a feje fölött van, akkor az alábbi példa megtekintése után világosabb lesz…)