Vue axios インターセプターは、繰り返しリクエストのキャンセルによく使用されます。

Vue axios インターセプターは、繰り返しリクエストのキャンセルによく使用されます。

導入

前回の記事では、axios のシンプルなカプセル化と、axios インターセプターの適用シナリオと方法について紹介しました。今日は、応答時間が長すぎたり、リクエスト数が多すぎたりする状況をインターセプターがどのように処理するかを見てみましょう。

リクエストをキャンセルする方法

Axiosは内部的に提供されるCancelTokenを使用してリクエストをキャンセルします

公式サイトの例1: 次のように、CancelToken.sourceファクトリーメソッドを使用してキャンセルトークンを作成します。

CancelToken は axios.CancelToken に置き換えられます。
const ソース = CancelToken.source();

axios.get('/user/12345', {
  キャンセルトークン: ソース.token
}).catch(関数(スロー) {
  もし(axios.isCancel(スロー)){
    console.log('リクエストがキャンセルされました', throwed.message);
  } それ以外 {
     // エラーを処理する }
});

axios.post('/user/12345', {
  名前: '新しい名前'
}, {
  キャンセルトークン: ソース.token
})

// リクエストをキャンセルします(メッセージパラメータはオプションです)
source.cancel('ユーザーによって操作がキャンセルされました。');

公式サイトの例 2: executor 関数を CancelToken コンストラクターに渡してキャンセル トークンを作成します。

CancelToken は axios.CancelToken に置き換えられます。
キャンセルする;

axios.get('/user/12345', {
  キャンセルトークン: 新しいキャンセルトークン(関数executor(c) {
    // 実行関数はキャンセル関数をパラメータとして受け取ります cancel = c;
  })
});

// リクエストをキャンセルする
キャンセル();

上記のキャンセルトークンはすべて1回のリクエストで作成されていることがわかります。実際の作業では、すべてのリクエストを処理する必要があります。次に、インターセプターでリクエストをキャンセルする機能を実装する方法を見てみましょう。

インターセプター内の重複リクエストをキャンセルする

'axios' から axios をインポートします
'./config' から baseURL をインポートします。
'qs' から qs をインポートします

const pendingRequest = new Map(); // リクエストオブジェクト const CancelToken = axios.CancelToken;

axios.defaults.timeout = 30000
axios.defaults.baseURL = ベースURL.target

// リクエストインターセプターを追加 axios.interceptors.request.use(function(config) {
  // リクエストを送信する前に何かを行う config.headers = {
      'コンテンツタイプ': 'application/json',
      'トークン': getToken()
  }
  // リクエストキーを取得する
  requestKey = getReqKey(config); を設定します。

  // 繰り返しリクエストかどうかを判断します if (pendingRequest.has(requestKey)) { // 繰り返しリクエストです removeReqKey(requestKey); // キャンセル }else{
    // キャンセルトークンを設定する
    config.cancelToken = 新しいCancelToken(関数executor(cancel) {
      pendingRequest.set(requestKey, cancel); // 設定 })
  }

  設定を返します。
}, 関数 (エラー) {
  // リクエストエラー return Promise.reject(error);
});

// レスポンスインターセプターを追加する axios.interceptors.response.use(function (response) {
  // リクエストオブジェクト内の requestKey を削除します
  requestKey = getReqKey(response.config); を設定します。
  リクエストキーを削除します。

  // 返されたデータを使って、ステータスをインターセプトするなどの処理を実行します。if (response.data.status !== 200) {
      トースト({
        メッセージ: response.data.message、
        タイプ: '警告'、
        期間: 1000
      })
      戻る
    }
    
  // 問題ありません。サーバーのデータを返します。 return response.data;
}, 関数 (エラー) {
  requestKey = getReqKey(error.config); を設定します。
  リクエストキーを削除します。
  
  // レスポンスエラー return Promise.reject(error);
});

// リクエストキーを取得する
関数 getReqKey(config) {
  // リクエストメソッド、リクエストアドレス、リクエストパラメータによって生成された文字列は、リクエストを繰り返すかどうかの基準として使用されます。const { method, url, params, data } = config; // これらのパラメータを分解します // GET ---> params POST ---> data
  const requestKey = [メソッド、URL、qs.stringify(params)、qs.stringify(data)].join('&');
  requestKeyを返します。
}

// 重複したリクエストをキャンセルする function removeReqKey(key) {
  const cancelToken = pendingRequest.get(キー);
  cancelToken(key); // 以前に送信したリクエストをキャンセルします pendingRequest.delete(key); // リクエストオブジェクト内の requestKey を削除します
}

結論

上記は繰り返しリクエストの処理です。インターセプターについてよくわからない場合は、前回の記事を読んでください。ご不明な点がございましたら、ご指摘いただければ幸いです。できるだけ早く更新します。

これで、vue axios インターセプターの一般的な繰り返しリクエストのキャンセルに関するこの記事は終了です。axios インターセプターの繰り返しリクエストのキャンセルに関する関連コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue はリクエストインターセプターと vue-resource インターセプターの使用を追加します
  • Vue axios ログインリクエストインターセプター
  • Vue ルーティングインターセプターとリクエストインターセプターの知識ポイントのまとめ
  • Vue が Axios リクエストとインターセプターをカプセル化する手順
  • Vueリクエストインターセプターの設定方法の詳しい説明

<<:  Alibaba Cloud ECSインスタンスのユーザールートパスワードとリモート接続方法を設定する方法

>>:  MySQL 8.0.20 Window10無料インストール版設定とNavicat管理チュートリアルグラフィック詳細説明

推薦する

Docker MySQLコンテナデータベースへの変更が有効にならない問題を解決する

公式の MySQL イメージを使用するには、構成ファイル、DB データ ファイル ディレクトリなどの...

JavaScript を使用せずに HTML の a タグを無効にするには、純粋な CSS を使用します。

実際、この問題は、HTML の select タグを初めて学んだときにすでに発生していました。今日に...

ウェブデザインにおける2種類のタブアプリケーション

現在、Web デザインではタブが広く使用されていますが、一般的に次の 2 つのタイプに分けられます。...

Vite2とVue3を使用したウェブサイトの国際化を実現するプロセス全体

目次序文vue-i18nをインストールするロケールの設定getLangs.js の実装i18nインス...

docker ベースの redis-sentinel クラスターの構築例

1. 概要Redis Cluster は、Redis ノードのグループ間での高可用性とシャーディング...

nginx をシャットダウン/再起動/起動する方法

閉鎖サービス nginx 停止systemctl 停止 nginx起動するサービス nginx 開始...

MySQL binlog の使用方法の詳細な説明

binlog は、MySQL のすべての DML 操作を記録するバイナリ ログ ファイルです。 bi...

20個のJavaScriptワンラインコードを共有する

目次1. ブラウザのクッキーの値を取得する2. RGBを16進数に変換する3. クリップボードにコピ...

Linux (Ubuntu) での MySQL 5.6.28 のインストールと設定のチュートリアル

mysql5.6.28のインストールと設定方法1. 基本的なシステム情報を確認し、yumでインストー...

LinuxにNginxをインストールする正しい手順

序文私のように、Java バックエンドに勤勉な人であれば、多数のプロジェクト機能を実装することに加え...

Vue プロジェクトで TS (TypeScript) を使用するための入門チュートリアル

目次1. Typescriptの紹介2. 設定ファイル webpack 設定3. プロジェクトに.t...

Web面接でよくある質問:リフローとリペイントの原理と違い

目次ブラウザのレンダリングメカニズムリフローと再塗装リフロー逆流を引き起こす行為:再描画再描画を引き...

Linux で lvm 論理ボリューム パーティションのサイズを調整するチュートリアル (xfs や ext4 などのさまざまなファイル システム用)

序文システムをインストールしたときに、パーティション領域を適切に割り当てませんでした。その後のメンテ...

JavaScript 戦略パターンを使用してフォームを検証する方法

目次概要戦略パターンを使用しないフォーム検証戦略パターンを使用して最適化する戦略パターンの利点要約す...

Vueは、商品の数を制御するためのコンポーネントのパッケージ化と使用を実装します。

Vueのコントロール商品数量コンポーネントのカプセル化と使用は参考までに。具体的な内容は以下のとお...