AbortController
Promiseの中断ができる
https://developer.mozilla.org/ja/docs/Web/API/AbortController
https://blog.jxck.io/entries/2017-07-19/aborting-fetch.html
fetch()の中断
https://zenn.dev/uhyo/articles/useeffect-taught-by-extremist#データを取得する系
gpt-4.icon
AbortControllerは、Web APIの一つで、Fetchリクエストやその他の非同期操作を中止するためのコントローラーです。これにより、不要になったリクエストを中断し、リソースを節約することができます。
基本的な使用法
AbortControllerは、AbortSignalオブジェクトを生成し、それをFetchリクエストなどの非同期操作に渡すことで機能します。
1. AbortControllerの作成
まず、AbortControllerのインスタンスを作成します。
code:js
const controller = new AbortController();
2. AbortSignalの取得
次に、controller.signalを通じてAbortSignalを取得します。このsignalをFetchリクエストに渡します。
code:js
const signal = controller.signal;
3. FetchリクエストにAbortSignalを渡す
Fetchリクエストのオプションにsignalを追加します。
code:js
fetch('https://example.com/data', { signal })
.then(response => response.json())
.then(data => {
console.log('Data:', data);
})
.catch(error => {
if (error.name === 'AbortError') {
console.log('Fetch aborted');
} else {
console.error('Fetch error:', error);
}
});
4. リクエストの中止
特定の条件下でリクエストを中止したい場合に、controller.abort()を呼び出します。
code:js
// 例えば、2秒後にリクエストを中止する
setTimeout(() => {
controller.abort();
}, 2000);
実際の使用例
実際にAbortControllerを使ってFetchリクエストを中止する例
code:js
const controller = new AbortController();
const signal = controller.signal;
fetch('https://jsonplaceholder.typicode.com/posts', { signal })
.then(response => response.json())
.then(data => {
console.log('Data:', data);
})
.catch(error => {
if (error.name === 'AbortError') {
console.log('Fetch aborted');
} else {
console.error('Fetch error:', error);
}
});
// 3秒後にリクエストを中止する
setTimeout(() => {
controller.abort();
}, 3000);
`
利点
1. リソースの節約
不要なリクエストを中断することで、サーバーとクライアントの両方のリソースを節約できます。
2. 競合状態の防止
非同期操作が複数同時に行われる場合、不要な操作を中断することで競合状態を防ぐことができます。
3. ユーザーエクスペリエンスの向上
ユーザーが次の操作を行った際に、前のリクエストを中断することで、応答性の高いアプリケーションを提供できます。
注意点
AbortControllerは、一度中止信号を送ると、そのAbortSignalに関連付けられたすべてのリクエストが中止されます。新しいリクエストを中止するには、新しいAbortControllerを作成する必要があります。
Fetch API以外にも、他のWeb API(例えば、ReadableStreamやXMLHttpRequest)でもAbortSignalを使用して中止することができます。