28. marts 2026

Asynkron iteration og generatorer

Asynkron iteration tillader os at iterere over data, der kommer asynkront, på baggrund af en forespørgsel. Det kan f.eks. være hvis vi downloader noget bid for bid over et netværk. Her er asynkrone generatorer praktiske.

Lad os starte med et simpelt eksempel, for at forstå syntaksen. Dererefter gennemgår vi et mere realistisk brugsscenarie.

Hvad var itererbare objekter?

Lad os først minde os om itererbare objekter.

Idéen er, at vi har et objekt, såsom range her:

let range = {
  from: 1,
  to: 5
};

… og vil gerne bruge for..of loop på det, såsom for(value of range), for at få værdier fra 1 til 5.

Med andre ord, vi vil gerne tilføje en itereringsmulighed til objektet.

Det kan implementeres ved hjælp af en speciel metode med navnet Symbol.iterator:

  • Denne metode er kaldt af for..of konstruktøren når loopen startes, og den skal returnere et objekt med next metoden.
  • For hver iteration kaldes next() metoden for at få den næste værdi.
  • Metoden next() skal returnere en værdi med formen {done: true/false, value:<loop value>}, hvor done:true betyder slutningen på loopet.

Her er en implementation til en itererbar range:

let range = {
  from: 1,
  to: 5,

  [Symbol.iterator]() { // kaldes én gang når for..of starter
    return {
      current: this.from,
      last: this.to,

      next() { // kaldes ved hver iteration, for at få den næste værdi
        if (this.current <= this.last) {
          return { done: false, value: this.current++ };
        } else {
          return { done: true };
        }
      }
    };
  }
};

for(let value of range) {
  alert(value); // 1 så 2, så 3, så 4, så 5
}

Hvis noget af dette er uklart, så besøg kapitlet Itererbare objekter, for at læse mere om iterable.

Asynkrone itererbare objekter

Asynkron iteration er nødvendig når værdier kommer asynkront: efter setTimeout eller andre typer af forsinkelse.

Det mest almindelige tilfælde er, når objektet skal lave en netværksforespørgsel for at levere den næste værdi. Det vil vi se et eksempel lidt senere.

For at gøre et objekt itererbart og asynkront, skal vi gøre følgende:

  1. Brug Symbol.asyncIterator i stedet for Symbol.iterator.
  2. Metoden next() vil returnere et promise (om at blive opfyldt med den næstkommende værdi).
    • Nøgleordet async håndterer den interne logik. Vi kan simpelthen kalde async next().
  3. For at iterere over sådan et objekt, skal vi bruge en for await (let item of iterable) loop.
    • Bemærk