AbortControllerによるタイムアウトと中止
非同期コードにタイムアウトを追加し、AbortControllerで処理をキャンセルします。シグナルをタスクに渡して早期に停止できるようにします。
「AbortControllerによるタイムアウトと中止」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全3レッスンが含まれています。
タイムアウトと中止が必要な理由
目標:長時間かかるタスクを安全に停止します。
- 簡単なタイムアウトを追加する
- AbortControllerを使う
- signalをタスクに渡す
- タイマーを後処理する

シグナル対応タスク
signal.abortを監視し、キャンセル時にタイマーを停止するタスクを作成します。
// Fake fetch that respects AbortSignal
function fakeFetch(ms, value, signal) {
return new Promise(function (resolve, reject) {
// Abort handler
function onAbort() {
clearTimeout(t);
reject(new Error("aborted"));
}
// If already aborted
if (signal && signal.aborted) {
return reject(new Error("aborted"));
}
// Finish timer
const t = setTimeout(function () {
if (signal) {
signal.removeEventListener("abort", onAbort);
}
resolve(value);
}, ms);
// Listen for abort
if (signal) {
signal.addEventListener("abort", onAbort);
}
});
}
fakeFetch(5, "OK").then(function (v) {
console.log("fakeFetch:", v);
});

Abortの動作
コントローラーを作成してsignalを渡し、abort()を呼び出してキャンセルします。
// AbortController cancels signal-aware tasks
const controller = new AbortController();
fakeFetch(20, "Too slow", controller.signal)
.then(function (v) {
console.log("done:", v);
})
.catch(function (e) {
console.log("catch:", e.message);
});
// Abort after a short delay
setTimeout(function () {
controller.abort();
console.log("aborted");
}, 5);

タイムアウトラッパー
Promise.raceを使うと、タスクに時間がかかりすぎた場合にrejectできます。タイマーはfinallyで解除します。
// Add a timeout to any Promise with Promise.race
function withTimeout(promise, ms) {
return Promise.race([
promise,
new Promise(function (_resolve, reject) {
const t = setTimeout(function () {
reject(new Error("timeout"));
}, ms);
// Small trick: clear timer when the main promise settles
promise.finally(function () { clearTimeout(t); });
})
]);
}
// Demo: this will time out
withTimeout(fakeFetch(30, "late"), 10)
.then(function (v) { console.log("value:", v); })
.catch(function (e) { console.log("timeout:", e.message); });

タイムアウトとAbortの組み合わせ
タイムアウトが先に発生した場合はabort()を呼び出し、基になる処理を早期に停止します。
// Combine: abort if timeout fires
async function fetchWithTimeout(msWork, msTimeout) {
const c = new AbortController();
const task = fakeFetch(msWork, "data", c.signal);
// If timeout wins, abort the task
try {
const result = await withTimeout(task, msTimeout);
return result;
} catch (e) {
c.abort();
throw e;
}
}
fetchWithTimeout(25, 10)
.then(function (v) { console.log("got:", v); })
.catch(function (e) { console.log("failed:", e.message); });

ヒントとチェックリスト
ヒント:
- タイマーは必ずfinallyで解除します。
- タスクにsignalを渡し、signal.abortedを確認します。
- リクエストごとに1つのコントローラーを使うことを優先します。

AbortControllerの基礎クイズ
簡単な確認:キャンセルのパターンです。

まとめ
まとめ:シグナルに対応したタスクを作成し、AbortControllerでキャンセルしました。Promise.raceでタイムアウトを追加し、その両方を組み合わせて安全に早期終了できるようにしました。

よくある質問
「AbortControllerによるタイムアウトと中止」レッスンは無料ですか?
はい。「AbortControllerによるタイムアウトと中止」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全3レッスンが含まれています。
「AbortControllerによるタイムアウトと中止」で何を学びますか?
非同期コードにタイムアウトを追加し、AbortControllerで処理をキャンセルします。シグナルをタスクに渡して早期に停止できるようにします。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
JavaScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。
「AbortControllerによるタイムアウトと中止」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJavaScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- async関数の作成、try/catch、並列処理と逐次処理
- AbortControllerによるタイムアウトと中止
- リトライとバックオフのパターン