再試行ロジック(簡易) — 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; // 最後まで失敗したら投げる
}
}
}
JavaScript2) 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);
}
JavaScript3) リトライ間に待機(バックオフ)
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回試す → 成功なら終了 → 失敗なら次へ」という流れを覚えると、リトライロジックの基本がすぐに理解できます。
