多くの開発者は AbortController を理解していると思っているかもしれませんが、その機能は基本をはるかに超えています。フェッチリクエストのキャンセルからイベントリスナーと React フックの管理まで。
AbortController がどれほど強力であるか本当に知っていますか?見てみましょう:
もちろん、フェッチで AbortController を使用するのが最も一般的な使用法です。
これは、AbortController を使用してキャンセル可能なフェッチ リクエストを作成する方法を示す例です:
fetchButton.onclick = async () => { const controller = new AbortController(); // Add a cancel button abortButton.onclick = () => controller.abort(); try { const response = await fetch('/json', { signal: controller.signal }); const data = await response.json(); // Perform business logic here } catch (error) { const isUserAbort = error.name === 'AbortError'; // AbortError is thrown when the request is canceled using AbortController } };
上記の例は、AbortController の導入前には不可能だった、ネットワーク リクエストをプログラムでキャンセルする機能を示しています。キャンセルすると、ブラウザはフェッチを停止し、ネットワーク帯域幅を節約します。重要なのは、キャンセルはユーザーが開始する必要はないということです。
controller.signal は AbortSignal オブジェクトを提供し、フェッチなどの非同期操作との通信を可能にし、それらの操作をキャンセルできるようにします。
複数の信号を 1 つの信号に結合するには、AbortSignal.any() を使用できます。その方法は次のとおりです:
try { const controller = new AbortController(); const timeoutSignal = AbortSignal.timeout(5000); const response = await fetch(url, { // Abort fetch if any of the signals are triggered signal: AbortSignal.any([controller.signal, timeoutSignal]), }); const data = await response.json(); } catch (error) { if (error.name === 'AbortError') { // Notify the user of cancellation } else if (error.name === 'TimeoutError') { // Notify the user of timeout } else { // Handle other errors, like network issues console.error(`Type: ${error.name}, Message: ${error.message}`); } }
AbortSignal では、次のことができます:
if (signal.aborted) { } signal.addEventListener('abort', () => {});
AbortController を使用してリクエストがキャンセルされると、サーバーはリクエストを処理したり応答を送信したりしなくなり、帯域幅が節約され、同時接続が減ることでクライアント側のパフォーマンスが向上します。
WebSocket などの古い API は、AbortSignal をネイティブにサポートしていません。代わりに、次のようにキャンセルを実装できます:
function abortableSocket(url, signal) { const socket = new WebSocket(url); if (signal.aborted) { socket.close(); // Abort immediately if already canceled } signal.addEventListener('abort', () => socket.close()); return socket; }
注: AbortSignal がすでに中止されている場合、中止イベントはトリガーされないため、このケースを事前に確認して処理する必要があります。
従来、イベント リスナーを削除するには、まったく同じ関数参照を渡す必要があります。
window.addEventListener('resize', () => doSomething()); window.removeEventListener('resize', () => doSomething()); // This won’t work
AbortController を使用すると、これが簡単になります。
const controller = new AbortController(); const { signal } = controller; window.addEventListener('resize', () => doSomething(), { signal }); // Remove the event listener by calling abort() controller.abort();
古いブラウザの場合は、AbortController をサポートするためにポリフィルを追加することを検討してください。
React では、前の非同期タスクが完了する前にコンポーネントが更新されると、エフェクトが誤って並列実行される可能性があります。
function FooComponent({ something }) { useEffect(async () => { const data = await fetch(url + something); // Handle the data }, [something]); return ...>; }
このような問題を回避するには、AbortController を使用して前のタスクをキャンセルします。
fetchButton.onclick = async () => { const controller = new AbortController(); // Add a cancel button abortButton.onclick = () => controller.abort(); try { const response = await fetch('/json', { signal: controller.signal }); const data = await response.json(); // Perform business logic here } catch (error) { const isUserAbort = error.name === 'AbortError'; // AbortError is thrown when the request is canceled using AbortController } };
最新の Node.js には、AbortController と互換性のある setTimeout 実装が含まれています。
try { const controller = new AbortController(); const timeoutSignal = AbortSignal.timeout(5000); const response = await fetch(url, { // Abort fetch if any of the signals are triggered signal: AbortSignal.any([controller.signal, timeoutSignal]), }); const data = await response.json(); } catch (error) { if (error.name === 'AbortError') { // Notify the user of cancellation } else if (error.name === 'TimeoutError') { // Notify the user of timeout } else { // Handle other errors, like network issues console.error(`Type: ${error.name}, Message: ${error.message}`); } }
ブラウザの setTimeout とは異なり、この実装はコールバックを受け入れません。代わりに、.then() または await を使用してください。
ブラウザは、AbortController を拡張する TaskController を使用してタスクの優先順位付けを行うために、scheduler.postTask() に移行しています。これを使用してタスクをキャンセルし、優先度を動的に調整できます:
if (signal.aborted) { } signal.addEventListener('abort', () => {});
優先制御が必要ない場合は、代わりに AbortController を使用できます。
AbortController は、最新の JavaScript 開発において不可欠なツールであり、非同期タスクを管理およびキャンセルするための標準化された方法を提供します。
ブラウザ環境と Node.js 環境の両方に統合されているため、その多用途性と重要性が強調されています。
AbortController を知らない場合は、今すぐその機能をすべて活用し、非同期プログラミング ツールキットの基礎にしてください。
本当にAbortControllerを知っていますか? は、Web ホスティング、非同期タスク、Redis 用の次世代サーバーレス プラットフォームです:
多言語サポート
無制限のプロジェクトを無料でデプロイ
比類のないコスト効率
効率化された開発者エクスペリエンス
簡単な拡張性と高いパフォーマンス
ドキュメントでさらに詳しく見てみましょう!
X でフォローしてください: @本当にAbortControllerを知っていますか?HQ
ブログをお読みください
以上が本当にAbortControllerを知っていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。