Node.js
Retry pattern
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.
Ö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;
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();
Kendini test et
-
retry(fn, 3) üçüncü denemede başarılı olursa ne olur?
await retry(fn, 3)
- Hata fırlatır
- Sonucu döndürür
- Döngüyü sürdürür
- fn çağrılmaz
Cevabı göster
Sonucu döndürür — try başarılı olursa sonuç döndürülür, döngü biter.
-
Parçayı rolüne eşle
- try
- İşi dener
- catch
- Hatayı yakalar
- maxAttempts
- Deneme sınırı
- throw lastError
- Son hatayı fırlatır
-
catch bloğunu tamamla
try {
return await fn(attempt);
} ____ (e) { lastError = e; }
Cevabı göster
try {
return await fn(attempt);
} catch (e) { lastError = e; }
Sıradaki ders: Debounce ve throttle