JavaScript
Asenkron iterasyon
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
-
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
-
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.
-
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 };
}
};
Sıradaki ders: Eş zamanlılık kontrolü