CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

index.js
// retry(fn, maxAttempts) fonksiyonu yaz
// try/catch ile dene, başarısızlıkta tekrar dene
// 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;
      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?

index.js
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

Soru
try {
  return await fn(attempt);
} ____ (e) { lastError = e; }
Cevap
try {
  return await fn(attempt);
} catch (e) { lastError = e; }

Açıklama: catch ile hata yakalanır.

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