序文開発中は、インターフェース要求の繰り返しによってさまざまな問題が発生することがよくあります。 実装のアイデア ** 1. リクエストを送信する前に、現在のリクエスト アドレス (URL + メソッド + パラメータ) をインターセプトします。 1. 通常、インターフェースは次のように記述します。リクエストインターフェースファイル import { http } from '@/plugin/axios'; // リクエストインターフェース http をインポートします // 初期化エクスポート関数 getInit(params) { http({を返す メソッド: 'get'、 URL: '/xxx/xxx/xx', パラメータ、 }); } 主なことは、ここで http メソッドを実行するときに操作を実行することです。 2. ここではaxiosの使い方を説明します。リクエスト関数を実行するときに外側にレイヤーをラップするという考え方です。 axios.js 構成ファイル 'axios' から axios をインポートします。 import { httpRequest, completeRequest } from './options'; // 実装したいロジックファイルはこちらです // ここでリクエストインターセプションをいくつか行い、具体的なレスポンスインターセプション操作については axios ドキュメントを参照してください const service = axios.create({ ベースURL: 'xxx/xxx', }); // リクエストインターセプター service.interceptors.request.use(config => {}, error => {}) // レスポンスインターセプター service.interceptors.response.use(response => { completeRequest(response); // 2. レスポンスリクエストが実行のために返される}, error => { }) export function http(config) { // => ここで config は渡されるリクエスト構成パラメータです return httpRequest(config, service); // + 1. ここでいくつかの論理演算を実行します} 3. ネットワーク設定ファイルの重複を防ぐオプション.js
/** * 責任: 重複したネットワークリクエストを防ぐ* */ let list = new Set(); // 1. リクエストキュー // MergeメソッドパラメータURLアドレス function getUrl(config = {}) { // リクエストパラメータの取得、パラメータ、ポストリクエストデータパラメータ、baseURL const { url, method, params, data, baseURL = '' } = config; urlVal = url.replace(baseURL, ''); `${urlVal}?${method === 'get' ? getformatObjVal(params) : getformatObjVal(data)}` を返します。 } // URLアドレスの処理 const getformatObjVal = (obj) => { obj = typeof obj === 'string' ? JSON.parse(`${obj}`): obj; var str = []; (pをobjに入れる) { obj.hasOwnProperty(p) && p !== '_t' の場合 { var item = obj[p] === null ? '' : obj[p]; // nullを処理する str.push(encodeURIComponent(p) + '=' + encodeURIComponent(item)); } } str.join('&') を返します。 } // 2. リクエストメソッドのエクスポート function httpRequest(config = {}, axios) { const url = getUrl(config); //3. ここで URL アドレスを取得しますif (list.has(url)) { // 4. リクエスト キューに現在の URL アドレスがあるかどうかを確認しますreturn Promise.reject('In the request'); // 5. リクエスト キュー内の現在のリクエストをキャンセルし、Promise の失敗結果を返します} // 6. リクエスト キューには現在の URL アドレスがありません。リクエストを送信し、URL アドレスをリクエスト キューに格納します。list.add(url); Promise.resolve(axios) を返します。 } (2)リクエスト応答が返ってきたら、リクエストキュー内の現在のURLアドレスを削除します(次のリクエストは正常に送信できます)。 // リクエストレスポンスが返ってきたらこの関数を実行します export function completeRequest(response = {}) { const { config } = response; // 1. レスポンス内のconfigは設定パラメータを取得できます const url = getUrl(config); // 2. URLアドレスを取得します if (list.has(url)) { list.delete(url); // 3. リクエストキュー内の現在のリクエスト URL アドレスを削除します} } アクシオス 'axios' から axios をインポートします。 import { httpRequest, completeRequest } from './options'; // 重複リクエストを防ぐ const service = axios.create({ ベースURL: 'xxx/xxx', }); // リクエストインターセプター service.interceptors.request.use(config => {}, error => {}) // レスポンスインターセプター service.interceptors.response.use(response => { completeRequest(response); // 2. レスポンスリクエストが戻ってきて実行します + }, エラー => { }) // エクスポート要求エクスポート関数 http(config) { return httpRequest(config, service); // 1. リクエストを送信する前に実行する} この時点で、重複したネットワーク リクエストの防止は実現できましたが、まだ問題が残っています。応答リクエストで例外が発生した場合、リクエスト キュー内の現在の URL アドレスをクリアする必要があります。クリーンアップされない場合、次のリクエストは直接キャンセルされます (ここではすべてのリクエスト キューをクリアするメソッドを記述しましたが、独自のシナリオに従って記述できます)。 /** * すべてのリクエストキューをクリアします */ エクスポート関数clearRequestList() { list = new Set(); // ここでクリアするだけです } 完全な http.js ファイル 'axios' から axios をインポートします。 import { httpRequest, completeRequest, clearRequestList } from './options'; // 重複したリクエストを防ぐ + constサービス = axios.create({ ベースURL: 'xxx/xxx', }); // リクエストインターセプター service.interceptors.request.use(config => {}, error => {}) // レスポンスインターセプター service.interceptors.response.use(response => { completeRequest(response); // 2. レスポンスリクエストが実行のために返される}, error => { クリアリクエストリスト(); // + }) // エクスポート要求エクスポート関数 http(config) { return httpRequest(config, service); // 1. リクエストを送信する前に実行する} 完全なoptions.js /** * 責任: 重複したネットワークリクエストを防ぐ* */ let list = new Set(); // 1. リクエストキュー // MergeメソッドパラメータURLアドレス function getUrl(config = {}) { // リクエストパラメータの取得、パラメータ、ポストリクエストデータパラメータ、baseURL const { url, method, params, baseURL = '' } = config; urlVal = url.replace(baseURL, ''); `${urlVal}?${method === 'get' ? getformatObjVal(params) : 'post'}` を返します。 } // URLアドレスの処理 const getformatObjVal = (obj) => { obj = typeof obj === 'string' ? JSON.parse(`${obj}`): obj; var str = []; (pをobjに入れる) { obj.hasOwnProperty(p) && p !== '_t' の場合 { var item = obj[p] === null ? '' : obj[p]; // nullを処理する str.push(encodeURIComponent(p) + '=' + encodeURIComponent(item)); } } str.join('&') を返します。 } // 2. リクエストメソッドのエクスポート function httpRequest(config = {}, axios) { const url = getUrl(config); //3. ここで URL アドレスを取得しますif (list.has(url)) { // 4. リクエスト キューに現在の URL アドレスがあるかどうかを確認しますreturn Promise.reject('In the request'); // 5. リクエスト キュー内の現在のリクエストをキャンセルし、Promise の失敗結果を返します} // 6. リクエスト キューには現在の URL アドレスがありません。リクエストを送信し、URL アドレスをリクエスト キューに格納します。list.add(url); Promise.resolve(axios) を返します。 } /** * この関数を実行するためのリクエスト応答 */ エクスポート関数 completeRequest(response = {}) { const { config } = response; // 1. レスポンス内の config は構成パラメータを取得できます const url = getUrl(config); // 2. URL アドレスを取得します list.has(url) && list.delete(url); // 3. リクエスト キュー内の現在のリクエスト URL アドレスを削除します } /** * すべてのリクエストキューをクリアします */ エクスポート関数 clearRequestList(error) { // エラーは構成を取得し、いくつかの操作を実行できます。 list = new Set(); // ここでクリアするだけです } 上記は、ネットワーク リクエストを防止する方法です。以前は、axios で CancelToken を使用してリクエストをキャンセルしていましたが、いくつか問題がありました。
これで、JavaScript で重複したネットワーク リクエストを防ぐ方法についての記事は終了です。JavaScript で重複したネットワーク リクエストを防ぐ方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
序文多くの場合、ユーザーが自分のデータに対して実行する操作に基づいて何かを行う必要があります。たとえ...
MySQL 5.7.9 バージョンの sql_mode=only_full_group_by の問題...
目次DOMノード要素ノード:テキストノード:プロパティ ノード:要素を取得getElementByI...
ページを更新せずにフォーム送信を実装するために Ajax を使用することは、プロジェクトでよく使用さ...
1. ネットワークマシンでは、デフォルトのcentosyumソースを使用します [root@kole...
忘れてしまった場合に後で戻って確認できるようにメモしておいてください。問題の説明:今日はちょっとした...
ショートハンドプロパティは、複数のプロパティに同時に値を割り当てるために使用されます。たとえば、fo...
<br />「良いデザインとは何か」と答える 1 万人に対して、少なくとも 1 万 1 ...
目次序文MySQL マスタースレーブレプリケーションMySQL でサポートされているレプリケーション...
3 つの属性 flex-grow、flex-shrink、flex-basis の機能は次のとおりで...
目次仮想DOMとは何ですか?なぜ仮想DOMが必要なのでしょうか?仮想 DOM はどのようにして実際の...
はじめに: 最近、会社のプロジェクトでデータベースのバージョンが変更されました。ここでは、MySQL...
最近、本番環境のデータベースがログデータを狂ったように書き込み、主キー値のオーバーフローを引き起こし...
Web プロジェクトでは、タイムライン コントロールをよく使用します。この記事では、項目ごとに展開で...
略語を使用すると、CSS ファイルのサイズが小さくなり、読みやすくなります。 CSS 省略形の主なル...