Generatori și Iteratori Asincroni (function* și for await…of) în JavaScript

Iteratori ECMAScript 2018+

Generarea secvențelor infinite și streaming-ul de date mari cu consum minim de memorie prin cuvântul cheie yield și consumarea fluxurilor cu for await...of.

Sintaxă
async function* citesteChunkuri() { yield await p; } for await (const chunk of citesteChunkuri()) {}

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.