AbortController でリクエストを中止する
実行中のリクエストを適切にキャンセルします。
「AbortController でリクエストを中止する」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全4レッスンが含まれています。
リクエストをキャンセルする理由
開始したリクエストが不要になることがあります。たとえば、ユーザーが別の画面へ移動した、検索語を入力し直した、またはタイムアウトになった場合です。AbortController を使うと、実行中の fetch をキャンセルできます。
コントローラーの作成
AbortController を作成します。fetch に渡す signal と、キャンセルに使用する abort() メソッドが提供されます。
const controller = new AbortController();
console.log(controller.signal); // an AbortSignalsignal の渡し方
オプションオブジェクトを使って、コントローラーの signal を fetch に渡します。これでリクエストをキャンセルできるようになります。
fetch(url, { signal: controller.signal });abort の呼び出し
controller.abort() を呼び出してキャンセルします。保留中の fetch の Promise は AbortError で reject されます。
const controller = new AbortController();
fetch(url, { signal: controller.signal });
controller.abort(); // cancels the requestAbortError の捕捉
catch の中で err.name === "AbortError" を確認し、意図的なキャンセルと実際の障害を区別します。
try {
await fetch(url, { signal: controller.signal });
} catch (err) {
if (err.name === "AbortError") console.log("Cancelled");
else throw err;
}タイムアウトのパターン
setTimeout と組み合わせると、遅いリクエストを自動的に abort できます。リクエストが先に完了した場合はタイマーを解除します。
const c = new AbortController();
const t = setTimeout(() => c.abort(), 5000);
await fetch(url, { signal: c.signal });
clearTimeout(t);組み込みのタイムアウトヘルパー
最近の環境には AbortSignal.timeout(ms) が用意されています。これは自動的に abort する signal を返します。自分で setTimeout を組み立てるよりもすっきり記述できます。
fetch(url, { signal: AbortSignal.timeout(5000) });前の検索をキャンセルする
入力中の検索では、新しいリクエストを開始する前に前のリクエストを abort します。これにより、古いレスポンスが新しい検索結果を上書きするのを防げます。
let current = null;
function search(q) {
if (current) current.abort();
current = new AbortController();
return fetch("/search?q=" + q, { signal: current.signal });
}1 つの signal で複数の fetch を制御する
1 つの signal で複数のリクエストを同時に abort できます。同じ signal を複数の fetch に渡すと、1 回の abort() ですべてをキャンセルできます。
const c = new AbortController();
fetch(a, { signal: c.signal });
fetch(b, { signal: c.signal });
c.abort(); // cancels bothすでに abort された signal
fetch に渡した時点ですでに signal が abort されている場合、リクエストはすぐに reject されます。状態を確認する必要がある場合は、signal.aborted を確認します。
if (controller.signal.aborted) console.log("already cancelled");アンマウント時のクリーンアップ
コンポーネントベースの UI では、コンポーネントが破棄されたときに未完了のリクエストを abort します。これにより、もう存在しないものの状態を設定するのを防げます。
const controller = new AbortController();
// on teardown:
controller.abort();クイックチェック
Fetch リクエストの abort です。
まとめ
AbortController を作成し、その signal を fetch に渡して、abort() を呼び出してキャンセルします。Promise は AbortError で reject されるため、名前で検出できます。タイムアウト(AbortSignal.timeout)、前の検索のキャンセル、複数リクエストのキャンセル、破棄時のクリーンアップに利用できます。
よくある質問
「AbortController でリクエストを中止する」レッスンは無料ですか?
はい。「AbortController でリクエストを中止する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全4レッスンが含まれています。
「AbortController でリクエストを中止する」で何を学びますか?
実行中のリクエストを適切にキャンセルします。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
JavaScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「AbortController でリクエストを中止する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJavaScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- GET リクエストを送信する
- POST とデータの送信
- エラーとステータスコードを処理する
- AbortController でリクエストを中止する