JavaScript 逆引き集 | 再試行ロジック(簡易)

JavaScript JavaScript
スポンサーリンク

再試行ロジック(簡易) — for(i=0;i<3;i++){ try{await f();break}catch{} }

「失敗するかもしれない処理を、何度か繰り返して成功を狙う」仕組みが 再試行ロジック(リトライ) です。ネットワーク通信や外部API呼び出しなどは一時的に失敗することがあるため、初心者でも簡単に書けるパターンを知っておくと便利です。


基本の書き方(簡易リトライ)

async function runWithRetry(f) {
  for (let i = 0; i < 3; i++) {       // 最大3回試す
    try {
      await f();                      // 成功したら break で抜ける
      console.log("成功");
      break;
    } catch (e) {
      console.warn("失敗:", e.message);
      // 3回目まで失敗したら次のループへ
    }
  }
}
JavaScript
  • forループ: 回数を決めて繰り返す。
  • try/catch: 失敗したら catch に入る。
  • break: 成功したらループを抜ける。

例題:不安定な処理をリトライ

// 疑似的にランダムで失敗する関数
async function unstableTask() {
  if (Math.random() < 0.5) throw new Error("ランダム失敗");
  return "OK";
}

async function main() {
  for (let i = 0; i < 3; i++) {
    try {
      const r = await unstableTask();
      console.log("成功:", r);
      break; // 成功したら終了
    } catch (e) {
      console.log(`試行${i+1}回目失敗:`, e.message);
    }
  }
}

main();
JavaScript
  • 50%の確率で失敗する処理を最大3回試す。
  • 成功したら終了、失敗したら次の試行へ。

すぐ使えるテンプレート集

1) 汎用リトライ関数

async function retry(f, times = 3) {
  for (let i = 0; i < times; i++) {
    try {
      return await f(); // 成功したら返す
    } catch (e) {
      if (i === times - 1) throw e; // 最後まで失敗したら投げる
    }
  }
}
JavaScript

2) fetch のリトライ

async function fetchWithRetry(url, times = 3) {
  return retry(async () => {
    const r = await fetch(url);
    if (!r.ok) throw new Error(`HTTP ${r.status}`);
    return r.json();
  }, times);
}
JavaScript

3) リトライ間に待機(バックオフ)

function delay(ms) {
  return new Promise(res => setTimeout(res, ms));
}

async function retryWithDelay(f, times = 3, ms = 500) {
  for (let i = 0; i < times; i++) {
    try {
      return await f();
    } catch (e) {
      if (i === times - 1) throw e;
      console.log(`失敗(${i+1}) → ${ms}ms待機`);
      await delay(ms);
    }
  }
}
JavaScript

実務でのポイント

  • 一時的な失敗に強い: ネットワークや外部APIは一度失敗しても再試行で成功することがある。
  • 回数制限: 無限ループは危険。必ず上限回数を決める。
  • 待機(バックオフ): 連続で叩くとサーバーに負荷。待機時間を入れると安全。
  • ログ: 失敗時にログを残すと原因調査がしやすい。

よくある落とし穴と対策

  • 最後まで失敗した場合: 何も返さず終了するとバグになる。
    → 対策: 最後の失敗は throw して呼び出し元に知らせる。
  • 待機なしで連続リトライ: サーバーに負荷をかける。
    → 対策: delay を入れる。指数的に伸ばす「エクスポネンシャルバックオフ」が一般的。
  • catchで握りつぶす: 失敗理由が分からなくなる。
    → 対策: ログ出力や通知を必ず入れる。

練習問題(手を動かして覚える)

// 1) ランダム失敗する関数を3回試す
async function randomFail() {
  if (Math.random() < 0.7) throw new Error("失敗");
  return "成功";
}
for (let i = 0; i < 3; i++) {
  try {
    console.log(await randomFail());
    break;
  } catch (e) {
    console.log("失敗:", e.message);
  }
}

// 2) fetchをリトライ
async function ex2() {
  try {
    const data = await fetchWithRetry("/api/data", 3);
    console.log(data);
  } catch (e) {
    console.error("最終的に失敗:", e.message);
  }
}

// 3) 待機付きリトライ
await retryWithDelay(() => randomFail(), 3, 1000);
JavaScript

直感的な指針

  • 「失敗するかも」な処理は try/catch で囲み、forループで回数制限。
  • 成功したら break、最後まで失敗したら throw。
  • 待機を入れるとより安全。
  • ログを残して原因を追えるようにする。

👉 初心者はまず「3回試す → 成功なら終了 → 失敗なら次へ」という流れを覚えると、リトライロジックの基本がすぐに理解できます。

タイトルとURLをコピーしました