1. ホーム
  2. ジャバスクリプト

[解決済み】HTTP fetch()リクエストをキャンセルするにはどうすればいいですか?

2022-04-18 18:21:07

質問

JavaScriptからリクエストを行うための新しいAPIがあります。 fetch() . これらのリクエストを機内でキャンセルする仕組みは組み込まれているのでしょうか?

解決方法は?

TL/DR。

fetch がサポートされるようになりました。 signal パラメータは、2017年9月20日現在では、しかし ではなく 現時点ではすべてのブラウザが対応しているようです .

2020年UPDATE。 主要ブラウザのほとんど(Edge、Firefox、Chrome、Safari、Opera、他数種) サポートする機能 の一部となっています。 DOMの生活水準 . (2020年3月5日現在)

しかし、これはすぐに見られる変更であるため、リクエストをキャンセルするためには AbortController s AbortSignal .

ロングバージョン

ハウツー

その方法はこうです。

ステップ1 : を作成します。 AbortController (とりあえず、私は これ )

const controller = new AbortController()

ステップ2 : を取得します。 AbortController のシグナルはこのようになります。

const signal = controller.signal

ステップ3 : を渡すと signal のようにフェッチします。

fetch(urlToFetch, {
    method: 'get',
    signal: signal, // <------ This is our AbortSignal
})

ステップ4 : 必要なときにいつでも中止してください。

controller.abort();

以下は、その動作例です(Firefox 57+で動作します)。

<script>
    // Create an instance.
    const controller = new AbortController()
    const signal = controller.signal

    /*
    // Register a listenr.
    signal.addEventListener("abort", () => {
        console.log("aborted!")
    })
    */


    function beginFetching() {
        console.log('Now fetching');
        var urlToFetch = "https://httpbin.org/delay/3";

        fetch(urlToFetch, {
                method: 'get',
                signal: signal,
            })
            .then(function(response) {
                console.log(`Fetch complete. (Not aborted)`);
            }).catch(function(err) {
                console.error(` Err: ${err}`);
            });
    }


    function abortFetching() {
        console.log('Now aborting');
        // Abort.
        controller.abort()
    }

</script>



<h1>Example of fetch abort</h1>
<hr>
<button onclick="beginFetching();">
    Begin
</button>
<button onclick="abortFetching();">
    Abort
</button>

ソース

  • の最終バージョンです。 AbortController が DOM 仕様に追加されました。
  • 対応PR のフェッチ仕様がマージされました。
  • AbortControllerの実装を追跡しているブラウザのバグはこちらで入手できます。Firefox #1378342 , Chromium: #750599 , WebKit: #174980 , Edge: #13009916 .