Node.js
Ö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.
Örnek çözümü göster
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();
Kendini test et
-
Hangi desen geçici hatalara dayanıklılık sağlar?
await retry(fn, 3)
- setTimeout
- debounce
- throttle
- retry
Cevabı göster
retry — retry, başarısız async işi yeniden deneyerek dayanıklılık sağlar.
-
Parçayı rolüne eşle
- 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
Sıradaki ders: Buffer nedir?