axios を使用してプロジェクト内の複数の繰り返しリクエストをフィルタリングする方法

axios を使用してプロジェクト内の複数の繰り返しリクエストをフィルタリングする方法

1. はじめに:

Web アプリケーションの開発プロセスでは、一度に複数のリクエストが開始されるシナリオに遭遇することがよくあります。

この場合、通常は 2 つのアプローチがあります。

  • ユーザーの操作を防ぐために、リクエスト時に読み込み画面を表示できます。
  • または、リクエストを制限するために手動で変数を追加します

私たちのプロジェクトでは、現在、ほとんどの場合、上記の 2 つの方法が使用されています。今日は新しい方法を紹介したいと思います。

2. CancelToken クラス

以前に Promise をインスタンス化しました。このオブジェクトが成功したかどうかは、関数の外部では判断できません。ここでは、Promise とその解決を分離するためにちょっとしたトリックを使用する必要があります。解決はいつでも発動できます:

  // 約束
  解決するPromise
  p = new Promise((resolve, deny) => { とする
    解決約束 = 解決
  })
  // これはresolvePromise()を外部で実行します

さて、この前提に基づいて、axios.CancelToken クラスを使用する必要があります。

このクラスは、各リクエストで別のプロミスを開き、promise.race (リクエスト p1、キャンセル リクエスト p2) を形成することと同じです。プロミスの解決メソッドは、受信する外部変数に割り当てられます。需要に応じて、以前のリクエストをキャンセルするかどうかを手動で決定できます。実際、これは、フェッチ カプセル化インターフェースがタイムアウトしたときに記述した Promise.race に似ています。

cancelToken は、cancelToken と、実際にはこのプロミスの解決である cancel メソッドを生成するための対応する静的メソッド ソースも提供します。

    CancelToken.source = 関数ソース() {
    var キャンセル;
    // 
    var token = new CancelToken(function executor(c) {
        キャンセル = c;
    });
    戻る {
        トークン: トークン、
        キャンセル: キャンセル、
    };

一般的なキャッシュ方法に従って、各リクエストの URL と対応するキャンセル メソッドを格納するマップを宣言できます。

    //グローバルマップを宣言する
    const pendingHttp = 新しい Map()
    // axios に組み込まれた CancelToken クラス const CancelToken = axios.CancelToken
       
    関数 addApi (config) {
      config.cancelToken = 新しいCancelToken((キャンセル) => {
        定数 url = config.url
        コンソールログ(保留中のHttp)
        if (!pendingHttp.has(url)) {
          pendingHttp.set(url, キャンセル)
        }
      })
    }

    関数 cancelApi (config) {
      定数 url = config.url
      if (pendingHttp.has(url)) { // 現在のリクエスト識別子が保留中に存在する場合は、現在のリクエストをキャンセルして削除する必要があります。const cancel = pendingHttp.get(url)
        キャンセル(url + 'キャンセル')
        pendingHttp.delete(url) // 現在の URL のキャッシュをクリアします}
    }
  • リクエストをキャンセルする場合は、config に cancelToken 属性を追加し、それを CancelToken のインスタンスに割り当てる必要があることに特に注意してください。そうしないとキャンセルできません。

タイマーを操作するのと同じように、次のタイマーを開始する前に、前のタイマーをキャンセルするようにしてください。

    httpService.interceptors.request.use(config => {

      キャンセルAPI(設定)
      APIの追加(設定)
      
      // ローカルでデバッグする場合はクロスドメインの状況であり、リクエスト ヘッダーの追加には制限があります (ここでのプロジェクト コードは無関係です)
      const { headers = {} } = config; const { globalObj = {} } = window
      オブジェクト.assign(headers, globalObj, { from })
      
      設定を返す
    }, エラー => {
      コンソール.log(エラー)
      Promise.reject(error) を返します。
    })

その後、最初のリクエストが返され、同じリクエストが再度開始される可能性もあるため、レスポンスには cancelApi も必要になります。

    httpService.interceptors.response.use(
      レスポンス => {
        cancelApi(レスポンス.config)
        sentryCatchApi(応答)
      },
      エラー => {
        // リクエストタイムアウトif (error.message.includes('timeout')) { // リクエスト例外情報にタイムアウト文字列が含まれているかどうかを判断します Toast.error({ text: 'Webページリクエストがタイムアウトしました。更新してもう一度お試しください~' })
        }
        sentryCatchApi(エラー)
        Promise.reject(error) を返します。
      }
    )

キャンセルは実際には解決であることに注意する必要があります。実行をキャンセルするときに渡されるパラメータは、最終的には応答のエラー コールバックのパラメータとして返されるため、エラー キャプチャ メソッドによってエラーが報告される可能性があります。

    // エラー メソッドが次のようにカプセル化されていると仮定します。 SentryCatchApiを見てみましょう
    エラー => {
      sentryCatchApi(エラー)
      Promise.reject(error) を返します。
    }
  // このメソッドはオブジェクトを受け取る必要がありますが、リクエストをキャンセルすると文字列が返され、エラーが報告されます。
  関数sentryCatchApi (res) {
      試す {
        解像度 = 解像度 || {}
        const resData = res.data || {}
        Sentry.captureException(JSON.stringify(resData))
        コンソール.log(`
          データの取得に失敗しました:
          トラブルシューティングを容易にするために、ブラウザで Webview のアドレスを開いて貼り付けてください: インターフェース関連情報:
          インターフェースアドレス: ${res.config.url},
          インターフェースの戻り値: コード: ${resData.code},
          メッセージ:${resData.message},
          データ:${JSON.stringify(resData.data)}
        `)
      } キャッチ (エラー) {
        コンソール.エラー(err)
      }
    }

isCancel APIを使用する必要がある

   エラー => {
    if (axios.isCancel(error)) return console.log('リクエストはキャンセルされました', error.message)
    sentryCatchApi(エラー)
    Promise.reject(error) を返します。
  }

最終結果

コンソールにエラーはありません。 (プロジェクト内で後日改善予定)

要約する

これで、axios を使用してプロジェクト内の繰り返しリクエストをフィルタリングする方法についての説明は終了です。axios による繰り返しリクエストのフィルタリングの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Axios はリクエストをキャンセルし、重複リクエストを回避します
  • Axiosは繰り返しのリクエストをキャンセル
  • Axios で繰り返して無駄なリクエストをキャンセルする方法
  • Vue axios 繰り返しクリックで最後のリクエストをキャンセルするカプセル化メソッド
  • 重複リクエストを削除するAxiosのソリューションについての簡単な説明

<<:  SQL文のANDとORの実行順序で発生する問題

>>:  Linux での rpm、yum、ソースコードの 3 つのインストール方法の詳細な紹介

推薦する

Linux のスケジュールタスク Crontab コマンドの使用に関する詳細な説明と概要

crontab コマンドは、Unix および Linux で定期的な実行命令を設定するために使用され...

centos7.2 オフラインインストール mysql5.7.18.tar.gz

ネットワークが分離されているため、MySQL は yum を使用してインストールできません。ここでは...

sqlalchemy に基づいて MySQL で追加、削除、変更、クエリ操作を実装する

需要シナリオ:上司は、クロ​​ーラーを使用してMySQLデータベースにデータを書き込んだり更新したり...

Discuz! フォーラムに設定オプションを追加する方法

Discuz! フォーラムにはバックグラウンドで多くの設定オプションがあり、これらの設定オプションを...

ウェブページのコメントにより IE でテキストがオーバーフローする

実験コードは次のとおりです。 </head> <body> <div ...

HTMLページがincludeを使用してphpファイルをインポートした後に余分な空白行があります

インターネットで見つけた方法は効果的ですinclude によって導入されたフッター ファイルとヘッダ...

HTML における DOM 要素のスクロールバースクロール制御の詳細な説明

dom要素に新しい子要素を追加し、新しく追加された新しい要素がコンテナーのスコープを超えた場合は、次...

Vue のトランジション効果とアニメーショントランジションの使用例の詳細な説明

目次遷移フック関数カスタム遷移クラス名遷移グループの使用まとめまずは例を見てみましょうコードは次のと...

HTMLポップアップ透明レイヤーインスタンスのサイズを設定でき、比例することができます

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

Linux ファイル管理コマンド例の分析 [表示、閲覧、統計など]

この記事では、Linux ファイル管理コマンドについて例を挙げて説明します。ご参考までに、詳細は以下...

iframe に関するいくつかの発見と考察

この物語は、今日の予期せぬ発見から始まります。同社には複数のウェブサイトがある。友達リンクにはお互い...

JavaScript の差異を利用して比較ツールを実装する

序文仕事では、毎週従業員が提出した資料を数える必要がありますが、それを一つずつコピーして貼り付けるの...

Vueの学習手順

目次1. v-text (v-instruction name = "variable&q...

Postman に基づく HTTP インターフェース テスト プロセスの分析

偶然、素晴らしい人工知能のチュートリアルを発見したので、みんなと共有せずにはいられませんでした。この...

VueプロジェクトでReactを書く方法の詳細

jsx/tsxファイルを直接作成できます今回のプロジェクト構成は以下のとおりです。 vueファイルで...