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管理チュートリアルグラフィック詳細説明

推薦する

MySQLテーブル内の重複データをクエリする方法

hk_test(ユーザー名、パスワード) に値を挿入 ('qmf1', '...

Windows 環境に mysql-8.0.11-winx64 をインストールする際に発生する問題を解決する

MySQL インストール パッケージをダウンロードします。mysql-8.0.11-winx64 を...

CentOS 8.4 での Docker パッケージのオフラインインストールの問題について

使用する仮想マシンは、サーバー環境をシミュレートする CentOS 8.4 です。外部ネットワークに...

CSSの一般的なプロパティ

CSS の背景: background:#00ffee; //背景色を設定するbackground-...

MySQLクエリトランザクション処理へのノード接続の実装

目次トピックmysqlの追加、削除、変更、クエリを入力しますMySQL トランザクション処理私は M...

LinuxでRPMを使用してmysql5.7.17をインストールする

LinuxでのMySQL5.7 rpmのインストール方法を参考までに記録します。具体的な内容は以下の...

MySQL がタイムスタンプを使用するときにタイムゾーンの問題を無視できるのはなぜですか?

私はいつも、なぜMySQLデータベースのtimestampタイムゾーンの問題を無視できるのか疑問に思...

純粋な JS を使用して vue.js で双方向バインディング機能を実装する方法

目次まず、双方向バインディングを実装するアイデアについて説明します。これらの機能を実装するための j...

カレンダーウィジェットのネイティブJS実装

この記事の例では、カレンダーウィジェットを実装するためのjsの具体的なコードを参考までに共有していま...

CSSアニメーション効果アニメーションの一般的なスタイル

アニメーションアニメーションを定義します。 /*アニメーションの各ステップで実行されるアクションを定...

純粋な CSS を使用して脈動するローダー効果のソースコードを作成する

効果プレビュー右側の「クリックしてプレビュー」ボタンを押すと現在のページでプレビューが表示され、リン...

SQL Server データベース エラー 5123 の解決方法

なぜなら、SQL Server 2005 に基づくデータベース チュートリアルがあり、そこで使用され...

Spring jdbc のデータベース操作オブジェクト モデルの詳細な例

Spring jdbc のデータベース操作オブジェクト モデルの詳細な例Spring Jdbc デー...

一般的なメールボックスで正常に表示できる HTML メールを作成するためのヒント

HTML メールを送信するためのヒント: スタイルを使用してインライン CSS を記述する、使用する...

MySQL でテーブルを削除する 3 つの方法 (要約)

ドロップテーブルドロップはテーブル情報を直接削除するため、最も高速ですが、データを取得することはでき...