ホームページ > ウェブフロントエンド > jsチュートリアル > 本当にAbortControllerを知っていますか?

本当にAbortControllerを知っていますか?

Patricia Arquette
リリース: 2025-01-17 02:38:09
オリジナル
709 人が閲覧しました

本当にAbortControllerを知っていますか?

多くの開発者は AbortController を理解していると思っているかもしれませんが、その機能は基本をはるかに超えています。フェッチリクエストのキャンセルからイベントリスナーと React フックの管理まで。

AbortController がどれほど強力であるか本当に知っていますか?見てみましょう:

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}`);
  }
}
ログイン後にコピー
ログイン後にコピー

AbortController と AbortSignal の違い

  • AbortController:controller.abort() を介して関連付けられたシグナルを明示的にキャンセルするために使用されます。
  • AbortSignal: 信号オブジェクトを表します。何も直接キャンセルすることはできませんが、中止された状態を通知します。

AbortSignal では、次のことができます:

  • signal.aborted を使用して中止されたかどうかを確認します。
  • 中止イベントをリッスンします。
if (signal.aborted) {
}
signal.addEventListener('abort', () => {});
ログイン後にコピー
ログイン後にコピー

AbortController を使用してリクエストがキャンセルされると、サーバーはリクエストを処理したり応答を送信したりしなくなり、帯域幅が節約され、同時接続が減ることでクライアント側のパフォーマンスが向上します。

AbortController の一般的な使用例

WebSocket接続のキャンセル

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 フックでの非同期タスクの管理

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 の使用

最新の 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 を使用してください。

高度なスケジュールのための TaskController

ブラウザは、AbortController を拡張する TaskController を使用してタスクの優先順位付けを行うために、scheduler.postTask() に移行しています。これを使用してタスクをキャンセルし、優先度を動的に調整できます:

if (signal.aborted) {
}
signal.addEventListener('abort', () => {});
ログイン後にコピー
ログイン後にコピー

優先制御が必要ない場合は、代わりに AbortController を使用できます。

結論

AbortController は、最新の JavaScript 開発において不可欠なツールであり、非同期タスクを管理およびキャンセルするための標準化された方法を提供します。

ブラウザ環境と Node.js 環境の両方に統合されているため、その多用途性と重要性が強調されています。

AbortController を知らない場合は、今すぐその機能をすべて活用し、非同期プログラミング ツールキットの基礎にしてください。


私たちは 本当にAbortControllerを知っていますか? であり、Node.js プロジェクトをクラウドにデプロイするための最良の選択肢です。

本当にAbortControllerを知っていますか?

本当にAbortControllerを知っていますか? は、Web ホスティング、非同期タスク、Redis 用の次世代サーバーレス プラットフォームです:

多言語サポート

  • Node.js、Python、Go、または Rust を使用して開発します。

無制限のプロジェクトを無料でデプロイ

  • 使用料金のみお支払いください。リクエストや料金はかかりません。

比類のないコスト効率

  • アイドル料金なしの従量課金制です。
  • 例: $25 は、平均応答時間 60 ミリ秒で 694 万のリクエストをサポートします。

効率化された開発者エクスペリエンス

  • 直感的な UI でセットアップが簡単です。
  • 完全に自動化された CI/CD パイプラインと GitOps の統合。
  • 実用的な洞察を得るリアルタイムのメトリクスとログ。

簡単な拡張性と高いパフォーマンス

  • 自動スケーリングにより、高い同時実行性を簡単に処理できます。
  • 運用上のオーバーヘッドがゼロ - 構築だけに集中できます。

ドキュメントでさらに詳しく見てみましょう!

Try 本当にAbortControllerを知っていますか?

X でフォローしてください: @本当にAbortControllerを知っていますか?HQ


ブログをお読みください

以上が本当にAbortControllerを知っていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート