Funcțiile generatoare (declarate cu asterisc function*) pot suspenda și relua execuția lor folosind cuvântul cheie yield. Spre deosebire de o funcție obișnuită (care calculează un tablou întreg în memorie și îl returnează dintr-o dată), un generator produce valori la cerere (Lazy Evaluation), consumând o cantitate infimă de memorie RAM chiar și pe colecții de date infinite.
Completate de Async Generators (async function*), acestea permit procesarea fluxurilor asincrone de date (streaming) prin bucla for await...of.
1. Generator sincron: Secvență infinită de ID-uri unice
function* genereazaIdSecvential() {
let id = 1;
while (true) {
yield `ID-${id++}`; // Suspendează execuția și returnează valoarea
}
}
const idGen = genereazaIdSecvential();
console.log(idGen.next().value); // "ID-1"
console.log(idGen.next().value); // "ID-2"
console.log(idGen.next().value); // "ID-3"
2. Generator asincron: Paginarea unui API masiv cu for await…of
// Generator asincron care descarcă paginile una câte una doar când sunt cerute:
async function* descarcaUtilizatoriPagina(totalPagini) {
for (let pagina = 1; pagina <= totalPagini; pagina++) {
const raspuns = await fetch(`https://api.exemplu.ro/utilizatori?page=${pagina}`);
const date = await raspuns.json();
for (const utilizator of date.items) {
yield utilizator; // Emițem fiecare utilizator individual
}
}
}
// Consumarea fluxului asincron fără a încărca toate paginile în memorie:
for await (const user of descarcaUtilizatoriPagina(10)) {
console.log(`Procesez utilizator: ${user.nume}`);
if (user.status === 'blocat') {
break; // Oprește descărcarea paginilor ulterioare!
}
}
Când se utilizează în producție
- Streaming de fișiere mari: Citirea unui fișier CSV sau log de 5 GB linie cu linie fără a bloca memoria serverului.
- Răspunsuri de la LLM-uri: Consumarea tokenilor generați în timp real (Server-Sent Events) de la modele AI precum OpenAI sau DeepSeek.