Generátory jsou funkce, které lze ukončit a později znovu zadat. Jejich kontext (vazby proměnných) se uloží napříč opětovnými vstupy.
Generátory v JavaScriptu – zejména v kombinaci s Promises – jsou velmi mocným nástrojem pro asynchronní programování, protože zmírňují – ne-li zcela odstraňují – problémy s callbacky, jako je Callback Hell a Inversion of Control. Ještě jednoduššího řešení těchto problémů však lze dosáhnout pomocí asynchronních funkcí.
Voláním generátorové funkce se její tělo neprovede okamžitě; místo toho je vrácen objekt iterátoru funkce. Při volání metody iterátoru next()
se tělo generátorové funkce vykonává až do prvního výrazu yield
, který určuje hodnotu, jež má být z iterátoru vrácena, nebo pomocí yield*
deleguje na jinou generátorovou funkci. Metoda next()
vrací objekt s vlastností value
obsahující výnosovou hodnotu a vlastností done
, která udává, zda generátor vydal poslední hodnotu, jako boolean. Zavolání metody next()
s argumentem obnoví provádění funkce generátoru, přičemž výraz yield
, jehož provádění bylo pozastaveno, nahradí argumentem z next()
.
Příkaz return
v generátoru po provedení způsobí, že generátor skončí (tj. vlastnost done
jím vráceného objektu bude nastavena na true
). Pokud je vrácena hodnota, bude nastavena jako vlastnost value
objektu vráceného generátorem.
Stejně jako příkaz return
, i chyba vyhozená uvnitř generátoru způsobí, že generátor skončí – pokud není zachycena v těle generátoru.
Když je generátor ukončen, následná volání next()
neprovedou žádný kód tohoto generátoru, pouze vrátí objekt tohoto tvaru: {value: undefined, done: true}
.