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

Python 3.7-Installationstutorial für MacBook

Der detaillierte Prozess der Installation von Pyt...

Tipps zur Kurzschrift in JavaScript

Inhaltsverzeichnis 1. Arrays zusammenführen 2. Ar...

3D-Tunneleffekt implementiert durch CSS3

Der erzielte EffektImplementierungscode html <...

Eine kurze Analyse zum besten Umgang mit vergessenen MySQL 8-Passwörtern

Vorwort Leser, die mit MySQL vertraut sind, werde...

Die Aktualisierung der Seite zur Formularübermittlung springt nicht

1. Quellcode entwerfen Code kopieren Der Code laut...

Zusammenfassung des Wissens zum MySQL-Protokoll

Inhaltsverzeichnis SQL-Ausführungsreihenfolge Bin...

MySQL-unabhängiger Index und gemeinsame Indexauswahl

Häufig fehlt das Verständnis für mehrspaltige Ind...

Weitergabe von Techniken für Farbkontrast und -harmonie im Web

Farbkontrast und Harmonie Unter kontrastierenden ...

Der HTML 5-Entwurf wurde kein formeller Standard

<br />Gestern habe ich beim W3C gesehen, das...

Detaillierte Schritte zur Remotebereitstellung einer MySQL-Datenbank unter Linux

Remotebereitstellung der MySQL-Datenbank unter Li...

Einige Hinweise zur MySQL-Self-Join-Deduplizierung

Lassen Sie mich kurz das Funktionsszenario erklär...