カランのブログ

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

四零二曜日電子報上線啦!訂閱訂起來

ソフトウェアエンジニア / 台湾人 / 福岡生活
このブログはRSS Feed をサポートしています。RSSリンクをクリックして設定してください。技術に関する記事はコードがあるのでブログで閲覧することをお勧めします。

今のモード ライト

我會把一些不成文的筆記或是最近的生活雜感放在短筆記,如果有興趣的話可以來看看唷!

記事のタイトルや概要は自動翻訳であるため(中身は翻訳されてない場合が多い)、変な言葉が出たり、意味伝わらない場合がございます。空いてる時間で翻訳します。

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

フロントエンドでは、主に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