Retry pattern
- Node.js kursu
- Orta seviye
- Ders 50/116
- 5 dk
Async retry desenini öğrenirsin.
Retry pattern
Retry pattern, bir async işin başarısız olursa tekrar denenmesi desenidir. Örnek: async function retry(fn, maxAttempts) { for (let attempt = 1; attempt <= maxAttempts; attempt++) { try { return await fn(attempt); } catch (e) { lastError = e; } } throw lastError; }.
try bloğunda fn(attempt) çağrılır. Başarılı olursa sonuç döndürülür. Hata fırlatırsa catch yakalar ve döngü bir sonraki denemeye geçer. maxAttempts kadar deneme yapılır; hepsi başarısız olursa son hata fırlatılır. Bu, ağ isteklerinde geçici hataları yönetmenin standart yoludur: sunucu meşgul olabilir, bağlantı kopabilir. Her denemede attempt sayısı artar; bu, fonksiyona hangi denemede olduğunu bildirir (backoff için kullanılabilir).
try/catch ile hata yakalama
Retry deseninin çekirdeği try/catch bloğudur. try { return await fn(attempt); } catch (e) { lastError = e; }. fn hata fırlatırsa catch yakalar ve lastError'e kaydeder; döngü devam eder.
catch (e) parametresi hata nesnesini alır. e.message hatanın açıklamasını verir. Bunu günlüğe yazabiliriz: console.log("Deneme " + attempt + " başarısız: " + e.message). Bu, hangi denemenin neden başarısız olduğunu izlemeyi sağlar. Eğer tüm denemeler tükenirse throw lastError ile son hata çağırana iletilir. Bu, çağıranın hatanın oluştuğunu bilmesini sağlar. Retry, yalnızca geçici hatalar için uygundur; kalıcı hatalar (yanlış URL) her zaman başarısız kalır.
Uygulama retry fonksiyonu yaz
async function retry(fn, maxAttempts) yaz: let lastError; ve for (let attempt = 1; attempt <= maxAttempts; attempt++) döngüsü. Gövdede try { return await fn(attempt); } catch (e) { lastError = e; console.log("Deneme " + attempt + " başarısız: " + e.message); }. Döngüden sonra throw lastError;. main() hazır.
Başlangıç kodu
// retry(fn, maxAttempts) fonksiyonu yaz
// try/catch ile dene, başarısızlıkta tekrar dene
// buraya yazÖrnek çözüm
async function retry(fn, maxAttempts) {
let lastError;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await fn(attempt);
} catch (e) {
lastError = e;
console.log("Deneme " + attempt + " başarısız: " + e.message);
}
}
throw lastError;
}
async function main() {
let count = 0;
const fn = async function(attempt) {
count++;
if (count < 3) throw new Error("Başarısız");
return "Başarılı (deneme " + attempt + ")";
};
const result = await retry(fn, 5);
console.log(result);
}
main();Beklenen çıktı
Deneme 1 başarısız: Başarısız Deneme 2 başarısız: Başarısız Başarılı (deneme 3)
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 retry(fn, 3) üçüncü denemede başarılı olursa ne olur?
await retry(fn, 3)- Hata fırlatır
- Sonucu döndürür Doğru cevap
- Döngüyü sürdürür
- fn çağrılmaz
Açıklama: try başarılı olursa sonuç döndürülür, döngü biter.
2 Parçayı rolüne eşle
| Kavram | Anlamı |
|---|---|
try |
İşi dener |
catch |
Hatayı yakalar |
maxAttempts |
Deneme sınırı |
throw lastError |
Son hatayı fırlatır |
3 catch bloğunu tamamla
try {
return await fn(attempt);
} ____ (e) { lastError = e; }
try {
return await fn(attempt);
} catch (e) { lastError = e; }
Açıklama: catch ile hata yakalanır.