Generatoarele sunt funcții care pot fi ieșite și reintroduse ulterior. Contextul lor (legăturile variabilelor) va fi salvat pe parcursul reintrărilor.
Generatoarele în JavaScript – în special atunci când sunt combinate cu Promises – sunt un instrument foarte puternic pentru programarea asincronă, deoarece atenuează – dacă nu elimină în întregime – problemele cu callback-urile, cum ar fi Callback Hell și Inversion of Control. Cu toate acestea, o soluție și mai simplă la aceste probleme poate fi obținută cu ajutorul funcțiilor asincrone.
Chemarea unei funcții generatoare nu execută imediat corpul acesteia; în schimb, se returnează un obiect iterator pentru funcția respectivă. Când metoda next()
a iteratorului este apelată, corpul funcției generatoare este executat până la prima expresie yield
, care specifică valoarea care trebuie returnată din iterator sau, cu yield*
, deleagă către o altă funcție generatoare. Metoda next()
returnează un obiect cu o proprietate value
care conține valoarea obținută și o proprietate done
care indică dacă generatorul a obținut ultima valoare, sub formă de boolean. Apelarea metodei next()
cu un argument va relua execuția funcției generatoare, înlocuind expresia yield
în care a fost întreruptă execuția cu argumentul din next()
.
O instrucțiune return
dintr-un generator, atunci când este executată, va face ca generatorul să se termine (adică proprietatea done
a obiectului returnat de aceasta va fi setată la true
). Dacă este returnată o valoare, aceasta va fi setată ca proprietate value
a obiectului returnat de generator.
La fel ca o instrucțiune return
, o eroare este aruncată în interiorul generatorului va face ca generatorul să fie terminat – cu excepția cazului în care este prins în corpul generatorului.
Când un generator este terminat, apelurile ulterioare next()
nu vor executa nici un cod al acelui generator, ci vor returna doar un obiect de această formă: {value: undefined, done: true}
.