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 のキャッシュをクリアします} }
タイマーを操作するのと同じように、次のタイマーを開始する前に、前のタイマーをキャンセルするようにしてください。 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: Linux での rpm、yum、ソースコードの 3 つのインストール方法の詳細な紹介
CSS セレクターHTML タグにスタイルを設定すると、タグの属性を設定できます。 <div ...
序文以前の非MKレコードを再編成するためのMySQLの学習説明する有効になっていない場合、データベー...
1. Yumのインストール yum でサブバージョンをインストール 2. 構成1. 倉庫を作る/ho...
1. dhtmlxツリー dHTMLxTree は機能豊富なツリー メニュー コントロールです。豊...
[LeetCode] 181.従業員の収入が管理職よりも多い従業員テーブルには、マネージャーを含む...
目次1 システムの紹介2 システムショートカット3 一般的なシステムコマンド1 システムの紹介 1....
フロントエンド ページの需要が増加し続けるにつれて、一部のシーンではグラデーションの背景要素が必要に...
序文最近は、PC、iPad、携帯電話、スマートウォッチ、スマートテレビなど、さまざまなデバイスが存在...
この記事では、弾性ナビゲーション効果を実現するためのJavaScriptの具体的なコードを参考までに...
目次1. 型2. インスタンス3. 違い1. 型typeof 演算子は、評価されていないオペランドの...
ザビックス2019/10/12 チェンシン参照するhttps://www.zabbix.com/do...
mysqldump コマンドはじめに: データベースバックアッププログラム形式: mysqldum...
すべてのプラットフォーム用の MySQL ダウンロードは、MySQL ダウンロードから入手できます。...
解決策はただ一つ、ソースを変更することです。 github からのソースは基本的にタイムアウトするの...
Mybatis ページングプラグイン pageHelper の詳細な説明と簡単な例動作フレームワーク...