logo
  • 現在做什麼
  • 關於我

Kalan

文章分類

  • 前端
  • 開發筆記
  • 雜談
  • 年度回顧

快速連結

  • 現在做什麼
  • 關於我
  • 聯絡我
  • 職涯思考🔗

關注我

在福岡生活的開發者,分享軟體開發與日本生活的點點滴滴。

© 2025 Kalan Made with ❤️. All rights reserved.

リクエストをキャンセルする新しい方法-AbortController

作成者:カランカラン2019年1月21日 9:00
ホーム/フロントエンド
💡

質問やフィードバックがありましたら、フォームからお願いします

英語原文

目次

    本文は台湾華語で、ChatGPT で翻訳している記事なので、不確かな部分や間違いがあるかもしれません。ご了承ください

    フロントエンドでは、主に2つの方法でリクエストを送信できます:XHR と Fetch です。XHR は、うーん、かなり昔から存在する API です。しかし、設定が面倒なため、しばしばより高レベルな API にラッピングされて使用されます。例えば、jQuery の getJSON、axios、RxJS の AjaxObservable などです。

    最近では、Promise が徐々に普及してきたことで、Fetch API はこれらの問題を大幅に改善することができました。返り値が Promise で、操作が便利なだけでなく、API も非常にシンプルです。

    とはいえ、依然として致命的な欠点があります。Fetch はリクエストをキャンセルできません。setTimeout を使って返り値を無視することはできますが、リクエストは依然として待機し続けます。XHR では XMLHttpRequest.abort を使ってキャンセルできますが、Fetch には同様の API がありません。

    しかし、最近!ついに新たな救世主、AbortController が登場しました。

    AbortController インターフェイスの abort() メソッドは、DOM リクエスト(例:Fetch リクエスト)が完了する前に中止します。これにより、fetch リクエストや、応答の Body の消費、ストリームを中止することができます。

    使い方は非常に簡単です。

    const abortController = new AbortController()
    const signal = abortController.signal

    そして、signal を fetch に渡すだけです。

    fetch("/long-running", { signal: signal })

    abortController.abort を呼び出すと、signal が fetch に送信されます。もし signal を受け取ったときにリクエストがまだ完了していなければ、そのリクエストはキャンセルされます。

    fetch("/long-running", { signal: signal })
    setTimeout(() => abortController.abort(), 5000)

    5 秒以内にリクエストが完了しなければ、キャンセルされます。


    RxJS でラッピングすれば、API がさらに便利に使えるかもしれません。しかし、現時点でのブラウザのサポート状況はあまり良くありません。

    ← CORS でのクッキーの取り扱いデバッグプロセスを記憶する — 接続 →

    この記事が役に立ったと思ったら、下のリンクからコーヒーを奢ってくれると嬉しいです ☕ 私の普通の一日が輝かしいものになります ✨

    ☕Buy me a coffee