CodeBlanks Logo Icon CodeBlanks

Özet - Async desenler

for await, retry ve debounce'u birleştirerek bir API istemcisi yazarsın.

Özet: API istemcisi

Bu derste öğrendiklerimizi birleştirerek bir API istemcisi yazacağız: retry, async generator ve for await birlikte.

İstemci şöyle çalışır: bir URL listesi verilir. Her URL için retry ile veri çekilir (geçici hatalara dayanıklı). Async generator, her başarıyla çekilen veriyi sırayla üretir. for await ile her sayfa tüketilir. Bu, gerçek bir API istemcisinin iskeletidir: retry ile güvenilirlik, async generator ile akış, for await ile tüketim. Birlikte, hatalara dayanıklı ve bellek verimli bir veri akışı oluştururlar.

Parçaları birleştirme

İstemci üç parçadan oluşur. Birincisi retry: async function retry(fn, maxAttempts) { ... }. İkincisi async generator: async function* fetchPages(urls) { for (const url of urls) { const data = await retry(async function(attempt) { ... }, 3); yield data; } }.

Üçüncüsü for await ile tüketim: for await (const page of fetchPages(urls)) { console.log(page); }. Burada her URL retry ile çekilir. İlk deneme başarısız olursa ikinci denemede başarılır. retry, attempt sayısını fonksiyona geçirir; bu sayede if (attempt < 2) throw ... ile ilk denemede hata simüle edilebilir. Async generator, başarıyla çekilen veriyi yield ile verir. for await her veriyi sırayla alır ve yazdırır. Bu, hatalara dayanıklı akışın tam desenidir.

Uygulama API istemcisini yaz

async function retry(fn, maxAttempts) yaz (try/catch ile). async function* fetchPages(urls) yaz: her url için const data = await retry(async function(attempt) { if (attempt < 2) throw new Error("Başarısız"); return url + ": deneme " + attempt; }, 3); yield data;. async function main() içinde for await (const page of fetchPages(["a", "b"])) { console.log("Sayfa: " + page); } yaz. main() çağır.

Başlangıç kodu

index.js
// retry fonksiyonu yaz (try/catch, maxAttempts döngüsü)
// async generator ile sayfaları sırayla üret
// döngüde tüket ve yazdır
// buraya yaz

Örnek çözüm

index.js
async function retry(fn, maxAttempts) {
  let lastError;
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
    try {
      return await fn(attempt);
    } catch (e) {
      lastError = e;
    }
  }
  throw lastError;
}

async function* fetchPages(urls) {
  for (const url of urls) {
    const data = await retry(async function(attempt) {
      if (attempt < 2) throw new Error("Başarısız");
      return url + ": deneme " + attempt;
    }, 3);
    yield data;
  }
}

async function main() {
  const urls = ["a", "b"];
  for await (const page of fetchPages(urls)) {
    console.log("Sayfa: " + page);
  }
}

main();

Beklenen çıktı

Sayfa: a: deneme 2
Sayfa: b: deneme 2

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Hangi desen geçici hatalara dayanıklılık sağlar?

index.js
await retry(fn, 3)
  • setTimeout
  • debounce
  • throttle
  • retry Doğru cevap

Açıklama: retry, başarısız async işi yeniden deneyerek dayanıklılık sağlar.

2 Parçayı rolüne eşle

Kavram Anlamı
retry Geçici hatalara dayanıklılık
async function* Veriyi akıtır
for await Akıtılan veriyi tüketir
yield Bir değer üretir

Orta seviye bölümündeki tüm dersler