重複リクエストを削除するAxiosのソリューションについての簡単な説明

重複リクエストを削除するAxiosのソリューションについての簡単な説明

このソリューションには2つの主な機能があります

1. リクエストが送信された後、後続の繰り返しリクエストはキャンセルされ、処理されず、最初のリクエストが完了するまで待機します。
2. ルートジャンプ後、前のページの未完了のリクエストはすべてクリアされます。

1. 重複したリクエストをキャンセルする

前提条件:

1. axiosが公式に提供しているキャンセル方法については、関連文書を参照してください:CancelToken
2.js マップ関連の概念
3. 安全なクエリ文字列解析および文字列分解ライブラリ qs。js に組み込まれた JSON に似ています。

パラメータ処理を簡素化するために、このソリューションでは POST リクエストのみを考慮します。つまり、メソッド、URL、データが同じ場合は重複リクエストと見なされます。

// アクシオス
const 保留中 = 新しい Map()
/**
 * リクエストを追加 * @param {Object} config
 **/
const addPending = (config) => {
  定数url = [
    config.method、
    config.url、
    qs.stringify(config.data)
  ]。参加する('&')
  if (pending.has(url)) { // 現在保留中のリクエストがある場合は、後続のリクエストをキャンセルします config.cancelToken = new axios.CancelToken(cancel => cancel(`重複したリクエストはアクティブにインターセプトされます: ${url}`))
  } else { // 現在のリクエストが保留中に存在しない場合は追加します config.cancelToken = config.cancelToken || new axios.CancelToken(cancel => {
      保留中.設定(url, キャンセル)
    })
  }
}
/**
 * リクエストを削除 * @param {Object} config
 */
const removePending = (config) => {
  定数url = [
    config.method、
    config.url.replace(config.baseURL, ''), // レスポンス URL にはドメイン名が追加されますが、リクエスト URL と一致するようにドメイン名を削除する必要があります。qs.stringify(JSON.parse(config.data)) // リクエスト パラメータ構造と一致する必要があります。リクエストはオブジェクトで、レスポンスは文字列です。].join('&')
  if (pending.has(url)) { // 現在のリクエスト識別子がpendingに存在する場合、現在のリクエストをキャンセルして削除します。pending.delete(url)
  }
}

/* axios グローバル リクエスト パラメータ設定、リクエスト インターセプター*/
axios.interceptors.request.use(
  設定 => {
    addPending(config) // 現在のリクエストを保留中の戻り設定に追加する
  },
  エラー => {
    Promise.reject(error) を返します。
  }
)
// レスポンスインターセプターは例外処理です axios.interceptors.response.use(
  レスポンス => {
    removePending(response.config) // リクエストが完了したら、このリクエストの返答を削除します
  },
  エラー => {
    if (err && err.config) {
      removePending(err.config) // リクエストが完了したら、このリクエストを削除します}
    Promise.resolve(err.response) を返します。
  }
)

2. すべてのリクエストをクリーンアップする

// アクシオス
/**
 * 保留中のリクエストをクリアする(ルーティングリダイレクト時に呼び出される)
 */
エクスポートconst clearPending = () => {
  for (const [url, cancel] of pending) {
    キャンセル(url)
  }
  保留中.クリア()
}
// ルータ.js
router.beforeEach((to, from, next) => {
  // ルートジャンプ、すべてのリクエストをクリア clearPending()
  })

Axios 重複排除リクエスト ソリューションに関するこの記事はこれで終わりです。Axios 重複排除リクエスト ソリューションの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • axios を使用してプロジェクト内の複数の繰り返しリクエストをフィルタリングする方法
  • Axios はリクエストをキャンセルし、重複リクエストを回避します
  • Axiosは繰り返しのリクエストをキャンセル
  • Axios で繰り返して無駄なリクエストをキャンセルする方法
  • Vue axios 繰り返しクリックで最後のリクエストをキャンセルするカプセル化メソッド

<<:  MySQL データベースで機密データの暗号化と復号化を実装する方法

>>:  Nginx を使用して IP アドレスが悪意を持って解決されるのを防ぐ方法

推薦する

MySQL 学習: 初心者のための 3 つのパラダイム

目次1. パラダイム基盤1.1 パラダイムの概念2. 3つの主要なパラダイム2.1 3つの主要なパラ...

純粋な CSS 実装 (スクリプトなし) HTML コマンド スタイルのツールチップ テキスト プロンプト効果

実行プロセスを分析します。マウスをノードに移動して、ノードにツールチップ実装を開くための識別子 (...

Vueは左上と右上のスライドナビゲーションを実装します

ナビゲーションなどは日々の開発でよく使うので、記録として記事を書きます。ナビゲーションは終了/開始位...

サーバーの購入と初期構築方法

しばらくサーバーいじってなかったけど、やることがなくなったのでモバイルワークスに行って海外サーバーを...

HTMLファイル内の中国語の文字化けとブラウザでの表示の問題

今日も私のページが文字化けしていたので、インターネットで関連する問題を検索しました。この方法はかなり...

CSS3は赤い封筒を振る効果を実現します

赤い封筒の揺れ効果を実現するには要件があります。これまでやったことがないので、記録しておきます。ヘヘ...

MACOS で MySQL ルートパスワードを忘れた場合の解決策

MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース...

Nginx+SpringBoot による負荷分散の実装例

負荷分散の概要Nginx の負荷分散実装を紹介する前に、負荷分散の分類について簡単に説明します。負荷...

Vueのフロントエンドシステムとフロントエンドとバックエンドの分離の詳細な説明

目次概要フロントエンド知識システムフロントエンドの3つの要素プレゼンテーション層 (CSS)動作レイ...

Windows 10 での Hyperledger Fabric 1.4 環境構築プロセスの図

内容Hyperledger fabric1.4環境のWindows 10でのセットアップ前提条件Wi...

アダプティブ Web デザインを実現する方法に関する関連知識ポイントの要約

「アダプティブ Web デザイン」はどのように機能しますか?実はそれほど難しいことではありません。 ...

DockerにTomcatコンテナを追加したときにホームページにアクセスできない問題の解決方法

質問docker run コマンドを使用して、tomcat コンテナが正常に追加されました。ポートも...

CSSスタイルシートとフォーマットレイアウトの詳細な説明

スタイルシートCSS (カスケーディング スタイル シート) は、HTML Web ページを美しくす...

el-tree での不完全なテキスト表示の解決策

目次方法1: 水平スクロールバーを設定する最も簡単な方法方法2(新規):ドラッグバーを追加して外側の...

停止したすべてのDockerコンテナを1つのコマンドで再起動する

停止したすべてのDockerコンテナを1つのコマンドで再起動するdocker ps -a | gre...