CodeBlanks Logo Icon CodeBlanks

Asenkron iterasyon

JavaScript kursu · İleri seviye · Ders 75/100

for await...of ile asenkron iterable'ları gezmeyi öğrenirsin.

Async iterable nedir?

Bir async iterable, Symbol.asyncIterator metodu bulunan bir nesnedir. Bu metot bir async iterator döndürür; iterator'ün .next() metodu bir Promise döndürür. for await...of döngüsü bu yapüyü adım adım tüketir.

const stream = {
  [Symbol.asyncIterator]() {
    return this;
  },
  async next() {
    return { value: 1, done: false };
  }
};

Bu desen, değerleri zamanla gelen veriler (sayfalanmış API'ler, log akışları) için çok uygundur.

Sayfalama deseni

Async iterables, sayfalanmış API'leri gezmek için idealdir. Toplam sayfa sayısını önceden bilmeden, her next() çağrısında bir sonraki sayfayı await ile getirirsin. Son sayfaya ulaşınca done: true döndürürsün.

async next() {
  if (this.page >= this.total) {
    return { done: true };
  }
  this.page = this.page + 1;
  const data = await fetchPage(this.page);
  return { value: data, done: false };
}

Bu yaklaşım, akıştaki veriyi tek tek işleyerek bellek tüketimini düşük tutar.

Uygulama Sayfalı veri akışı

pages adında bir async iterable nesne oluştur. current: 0 ve total: 3 özellikleri olsun. Symbol.asyncIterator metodu this döndürsün. async next() metodu yaz: current total'e ulaşınca { done: true } döndürsün; değilse current'i 1 artırıp Promise.resolve('page-' + current) değerini await ile alıp { value, done: false } döndürsün. En son for await...of ile pages'i gez ve her değeri console.log ile yazdır.

Örnek çözümü göster
const pages = {
  current: 0,
  total: 3,
  [Symbol.asyncIterator]() {
    return this;
  },
  async next() {
    if (this.current >= this.total) {
      return { value: undefined, done: true };
    }
    this.current = this.current + 1;
    const value = await Promise.resolve('page-' + this.current);
    return { value, done: false };
  }
};
for await (const page of pages) {
  console.log(page);
}

Kendini test et

  1. Async iterasyon kavramlarını eşleştir

    Symbol.asyncIterator
    protokol anahtarı
    .next()
    Promise döndürür
    for await...of
    tüketir
    { value, done }
    sonuç şekli
  2. Bir async iterable'ı tüketmek için hangi sözdizimi kullanılır?

    • for (const x of asyncIterable)
    • asyncIterable.forEach(await ...)
    • while (await asyncIterable.next())
    • for await (const x of asyncIterable)
    Cevabı göster

    for await (const x of asyncIterable) — Doğru! for await...of, async iterable'ları tüketen standart sözdizimidir.

  3. Async iterator metodu

    const stream = {
      [Symbol.____]() { return this; },
      async next() {
        return { value: 1, done: true };
      }
    };
    Cevabı göster
    const stream = {
      [Symbol.asyncIterator]() { return this; },
      async next() {
        return { value: 1, done: true };
      }
    };

İleri seviye bölümündeki tüm dersler