Ein Beispiel, wie JavaScript doppelte Netzwerkanforderungen verhindern kann

Ein Beispiel, wie JavaScript doppelte Netzwerkanforderungen verhindern kann

Vorwort

Während der Entwicklung stoßen wir häufig auf verschiedene Probleme, die durch wiederholte Schnittstellenanforderungen verursacht werden.
Wiederholte Netzwerkanforderungen führen dazu, dass die Seite mehrmals aktualisiert wird, was zu Seitenschwankungen führt und sich auf das Benutzererlebnis auswirkt.
Wenn beispielsweise auf die aktuelle Seitenanforderung noch keine Antwort eingegangen ist und auf andere Routen umgeschaltet wird, werden diese Anforderungen erst beendet, wenn die Antwort zurückgegeben wird.
Ob aus der Perspektive der Benutzererfahrung oder aus geschäftlichen Gründen: Das Abbrechen nutzloser Anfragen muss vermieden werden.

Umsetzungsideen

** 1. Fangen Sie die aktuelle Anforderungsadresse (URL + Methode + Parameter) ab, bevor Sie die Anforderung senden.
** 2. Öffnen Sie eine Anforderungswarteschlange, um die aktuelle Adresse zu speichern.
** 3. Überprüfen Sie, ob für jede Anforderung eine aktuelle URL-Adresse in der Anforderungswarteschlange vorhanden ist.
** 4. Wenn sich die aktuelle URL-Adresse in der Anforderungswarteschlange befindet, brechen Sie die aktuelle Anforderung ab.
** 5. Wenn nicht, senden Sie die Anfrage. Wenn die Anfragedaten zurückgegeben werden, löschen Sie die aktuelle URL-Adresse in der Anfragewarteschlange.

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.
Beim Ausführen der http-Funktion können alle Konfigurationen der Anfrage abgerufen werden und ein Promise-Objekt wird zurückgegeben.

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
(1) Überprüfen Sie vor dem Senden einer Anfrage, ob sich eine aktuelle Anfrage in der Anfragewarteschlange befindet (bestimmt durch die URL-Adresse).

  • Die Anforderungswarteschlange verfügt über die aktuelle URL-Adresse. Brechen Sie die Anforderung ab und geben Sie promise.reject-Fehler zurück.
  • Es liegt keine aktuelle Anfrage vor, daher wird die Anfrage normal gesendet;
/**
 * 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.)
Optionen.js

// 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.

  1. Es ist eine Konfiguration von Anforderungsdateien erforderlich, was nicht benutzerfreundlich ist und auch bei der Konfiguration der Teamentwicklung Probleme bereitet.
  2. CancelToken muss für jede Anfrage konfiguriert werden. Es gibt zwei Möglichkeiten, es zu verwenden. Weitere Informationen finden Sie in der Dokumentation der offiziellen Website.

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:
  • So verhindern Sie die doppelte Übermittlung von JS-Ajax-Anfragen
  • JavaScript verwendet Promise zur Verarbeitung mehrerer wiederholter Anfragen

<<:  Detaillierter Informationsaustausch über das MySQL-Protokollsystem

>>:  Detaillierte Erläuterung des Nginx-Strombegrenzungsmoduls in der Nginx-Quellcode-Recherche

Artikel empfehlen

Nginx löst Cross-Domain-Probleme und bindet Seiten von Drittanbietern ein

Inhaltsverzeichnis Vorwort Schwierigkeit Domänenü...

6 Lösungen für Netzwerkfehler im Docker-Container

6 Lösungen für Netzwerkfehler im Docker-Container...

Tutorial zur Installation und Konfiguration der Linux CentOS MySQL-Datenbank

Hinweise zur Installation der MySQL-Datenbank, mi...

Linux-Systemaufrufe für Betriebsdateien

Inhaltsverzeichnis 1. Öffnen Sie die Datei Parame...

Zusammenfassung der @-Verwendung in CSS (mit Beispielen und Erklärungen)

Eine At-Regel ist eine Deklaration, die Anweisung...

Implementierungsmethode und Beispielcode des Tomcat-Klassenladers

Tomcat definiert intern mehrere ClassLoader, soda...

Detaillierte Erklärung der Schlüsselwörter und reservierten Wörter in MySQL 5.7

Vorwort Die Schlüsselwörter von MySQL und Oracle ...

Schritte zum Ändern des MySQL-Zeichensatzes auf UTF8 unter Linux

Inhaltsverzeichnis 1. Überprüfen Sie den MySQL-St...

So verwenden Sie Docker+DockerCompose zum Kapseln von Webanwendungen

Inhaltsverzeichnis Technologie-Stack Backend-Buil...

3 Möglichkeiten, die maximale Anzahl von Verbindungen in MySQL richtig zu ändern

Wir alle wissen, dass die standardmäßige MySQL-Da...

Detaillierte Erklärung der Semiotik in Html/CSS

Basierend auf Theorien wie Saussures Sprachphilos...

Vue verwendet dynamische Komponenten, um einen TAB-Umschalteffekt zu erzielen

Inhaltsverzeichnis Problembeschreibung Was ist di...