Vorwort Während der Entwicklung stoßen wir häufig auf verschiedene Probleme, die durch wiederholte Schnittstellenanforderungen verursacht werden. Umsetzungsideen ** 1. Fangen Sie die aktuelle Anforderungsadresse (URL + Methode + Parameter) ab, bevor Sie die Anforderung senden. 1. Normalerweise schreiben wir Schnittstellen wie diese: Schnittstellendatei anfordern import { http } von '@/plugin/axios'; // Anforderungsschnittstelle http importieren // Initialisierung Exportfunktion getInit(params) { return http({ Methode: 'get', URL: „/xxx/xxx/xx“, Parameter, }); } Die Hauptsache besteht darin, Operationen beim Ausführen der http-Methode hier durchzuführen. 2. Hier demonstrieren wir die Verwendung von Axios. Die Idee besteht darin, beim Ausführen der Anforderungsfunktion eine Schicht außen einzuschließen axios.js-Konfigurationsdatei importiere Axios von „Axios“; import { httpRequest, completeRequest } from './options'; // Hier ist die Logikdatei, die wir implementieren möchten // Führen Sie darin einige Anforderungsabfangvorgänge durch und sehen Sie sich das Axios-Dokument für spezifische Antwortabfangvorgänge an const service = axios.create({ Basis-URL: 'xxx/xxx', }); //Interceptor anfordern service.interceptors.request.use(config => {}, error => {}) // Antwort-Interceptor service.interceptors.response.use(response => { completeRequest(response); // 2. Antwortanforderung kommt zur Ausführung zurück}, error => { }) export function http(config) { // => Hier ist config der übergebene Anforderungskonfigurationsparameter return httpRequest(config, service); // + 1. Führen Sie hier einige logische Operationen aus} 3. Verhindern Sie die Duplizierung von Netzwerkkonfigurationsdateien Optionen.js
/** * Verantwortung: Doppelte Netzwerkanfragen verhindern* */ let list = new Set(); // 1. Anforderungswarteschlange // Merge-Methode Parameter URL-Adresse Funktion getUrl(config = {}) { // Anfrageparameter abrufen Parameter Anfragedatenparameter, Basis-URL const { URL, Methode, Parameter, Daten, Basis-URL = '' } = Konfiguration; const urlVal = url.replace(baseURL, ''); gibt `${urlVal}?${method === 'get' ? getformatObjVal(params) : getformatObjVal(data)}` zurück; } // URL-Adresse wird verarbeitet const getformatObjVal = (obj) => { obj = Typ von obj === 'Zeichenfolge' ? JSON.parse(`${obj}`) : obj; var str = []; für (lass p in obj) { wenn (obj.hasOwnProperty(p) und p !== '_t') { var item = obj[p] === null ? '' : obj[p]; // null verarbeiten str.push(encodeURIComponent(p) + '=' + encodeURIComponent(item)); } } str.join('&') zurückgeben; } // 2. Anforderungsmethode export function httpRequest(config = {}, axios) { const url = getUrl(config); //3. Hier erhalten wir die URL-Adresseif (list.has(url)) { // 4. Überprüfen Sie, ob die Anforderungswarteschlange die aktuelle URL-Adresse hatreturn Promise.reject('In der Anforderung'); // 5. Brechen Sie die aktuelle Anforderung in der Anforderungswarteschlange ab und geben Sie das Promise-Fehlerergebnis zurück} // 6. Die Anforderungswarteschlange verfügt nicht über die aktuelle URL-Adresse. Senden Sie die Anforderung und speichern Sie die URL-Adresse in der Anforderungswarteschlange.list.add(url); gibt Promise.resolve(axios) zurück; } (2) Nachdem die Anforderungsantwort zurückgekommen ist, löschen Sie die aktuelle URL-Adresse in der Anforderungswarteschlange. (Die nächste Anforderung kann normal gesendet werden.) // Führen Sie diese Funktion aus, nachdem die Anforderungsantwort zurückkommt. Exportfunktion completeRequest(response = {}) { const { config } = response; // 1. Die Konfiguration in der Antwort kann die Konfigurationsparameter abrufen const url = getUrl(config); // 2. Die URL-Adresse abrufen if (list.has(url)) { list.delete(url); // 3. Lösche die aktuelle Anforderungs-URL-Adresse in der Anforderungswarteschlange} } axios.js importiere Axios von „Axios“; importiere { httpRequest, completeRequest } von './options'; // Doppelte Anfragen verhindern const service = axios.create({ Basis-URL: 'xxx/xxx', }); //Interceptor anfordern service.interceptors.request.use(config => {}, error => {}) // Antwort-Interceptor service.interceptors.response.use(response => { completeRequest(response); // 2. Antwortanforderung kommt zur Ausführung zurück + }, Fehler => { }) // Anfrage exportieren export function http(config) { return httpRequest(config, service); // 1. Vor dem Senden der Anfrage ausführen} An diesem Punkt haben wir es geschafft, doppelte Netzwerkanforderungen zu verhindern, aber es besteht immer noch ein Problem. Wenn in der Antwortanforderung eine Ausnahme auftritt, müssen wir die aktuelle URL-Adresse in der Anforderungswarteschlange löschen. Wenn keine Bereinigung erfolgt, wird die nächste Anforderung direkt abgebrochen (hier habe ich gerade eine Methode zum Löschen aller Anforderungswarteschlangen geschrieben, Sie können sie entsprechend Ihrem eigenen Szenario schreiben). /** * Alle Anforderungswarteschlangen löschen */ Exportfunktion clearRequestList() { list = new Set(); // Ich lösche es einfach hier } Vollständige http.js-Datei importiere Axios von „Axios“; importiere { httpRequest, completeRequest, clearRequestList } von './options'; // Doppelte Anfragen verhindern + const service = axios.create({ Basis-URL: 'xxx/xxx', }); //Interceptor anfordern service.interceptors.request.use(config => {}, error => {}) // Antwort-Interceptor service.interceptors.response.use(response => { completeRequest(response); // 2. Antwortanforderung kommt zur Ausführung zurück}, error => { Anforderungsliste löschen(); // + }) // Anfrage exportieren export function http(config) { return httpRequest(config, service); // 1. Vor dem Senden der Anfrage ausführen} Vervollständigen Sie options.js /** * Verantwortung: Doppelte Netzwerkanfragen verhindern* */ let list = new Set(); // 1. Anforderungswarteschlange // Merge-Methode Parameter URL-Adresse Funktion getUrl(config = {}) { // Anfrageparameter abrufen Parameter Anfragedatenparameter, Basis-URL const { url, method, params, baseURL = '' } = konfiguration; const urlVal = url.replace(baseURL, ''); gibt `${urlVal}?${method === 'get' ? getformatObjVal(params) : 'post'}` zurück; } // URL-Adresse wird verarbeitet const getformatObjVal = (obj) => { obj = Typ von obj === 'Zeichenfolge' ? JSON.parse(`${obj}`) : obj; var str = []; für (lass p in obj) { wenn (obj.hasOwnProperty(p) und p !== '_t') { var item = obj[p] === null ? '' : obj[p]; // null verarbeiten str.push(encodeURIComponent(p) + '=' + encodeURIComponent(item)); } } str.join('&') zurückgeben; } // 2. Anforderungsmethode export function httpRequest(config = {}, axios) { const url = getUrl(config); //3. Hier erhalten wir die URL-Adresseif (list.has(url)) { // 4. Überprüfen Sie, ob die Anforderungswarteschlange die aktuelle URL-Adresse hatreturn Promise.reject('In der Anforderung'); // 5. Brechen Sie die aktuelle Anforderung in der Anforderungswarteschlange ab und geben Sie das Promise-Fehlerergebnis zurück} // 6. Die Anforderungswarteschlange verfügt nicht über die aktuelle URL-Adresse. Senden Sie die Anforderung und speichern Sie die URL-Adresse in der Anforderungswarteschlange.list.add(url); gibt Promise.resolve(axios) zurück; } /** * Antwort anfordern, um diese Funktion auszuführen */ Exportfunktion CompleteRequest (Antwort = {}) { const { config } = response; // 1. config kann in der Antwort Konfigurationsparameter abrufen const url = getUrl(config); // 2. URL-Adresse abrufen list.has(url) && list.delete(url); // 3. Aktuelle Anforderungs-URL-Adresse in der Anforderungswarteschlange löschen } /** * Alle Anforderungswarteschlangen löschen */ Exportfunktion ClearRequestList (Fehler) { // Fehler kann die Konfiguration abrufen und einige Vorgänge ausführen. list = new Set(); // Ich lösche es einfach hier } So verhindere ich Netzwerkanfragen. Ich habe CancelToken in Axios bereits verwendet, um Anfragen abzubrechen. Es gibt jedoch einige Probleme.
Damit ist dieser Artikel zum Verhindern doppelter Netzwerkanforderungen mit JavaScript abgeschlossen. Weitere Informationen zum Verhindern doppelter Netzwerkanforderungen mit JavaScript finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Detaillierter Informationsaustausch über das MySQL-Protokollsystem
>>: Detaillierte Erläuterung des Nginx-Strombegrenzungsmoduls in der Nginx-Quellcode-Recherche
Inhaltsverzeichnis Vorwort Schwierigkeit Domänenü...
6 Lösungen für Netzwerkfehler im Docker-Container...
Hinweise zur Installation der MySQL-Datenbank, mi...
Inhaltsverzeichnis 1. Öffnen Sie die Datei Parame...
Eine At-Regel ist eine Deklaration, die Anweisung...
Es gibt viele Lese-/Schreibtrennungsarchitekturen...
Tomcat definiert intern mehrere ClassLoader, soda...
1. Implementierungsprinzip des Scrollens Das Scro...
1. Kauf des Servers 1. Ich habe mich für den Serv...
Vorwort Die Schlüsselwörter von MySQL und Oracle ...
Inhaltsverzeichnis 1. Überprüfen Sie den MySQL-St...
Inhaltsverzeichnis Technologie-Stack Backend-Buil...
Wir alle wissen, dass die standardmäßige MySQL-Da...
Basierend auf Theorien wie Saussures Sprachphilos...
Inhaltsverzeichnis Problembeschreibung Was ist di...