カランのブログ

ソフトウェアエンジニア / 台湾人 / 福岡生活

今のモード ライト

フロントエンドでは、主に2つの方法でリクエストを送信することができます:XHRFetch。XHRは、ええと...かなり昔から存在するAPIです。ただし、設定が煩雑なため、よくjQuerygetJSONaxios、RxJSのAjaxObservableなどのより高レベルなAPIでラップされて使用されます。

しかし、近年、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

作者

Kalan 頭像照片,在淡水拍攝,淺藍背景

愷開 | Kalan

Kalan です。台湾出身で、2019年に日本へ転職し、福岡に住んでいます。フロントエンド開発に精通しているだけでなく、IoT、アプリ開発、バックエンド、電子工作などの分野にも挑戦しています。 最近、エレキギターを始めました。ブログを通じて、より多くの人と交流できればと思っています。気軽に絡んでください