So verwenden Sie Axios, um mehrere wiederholte Anfragen in einem Projekt zu filtern

So verwenden Sie Axios, um mehrere wiederholte Anfragen in einem Projekt zu filtern

1. Einleitung:

Bei der Entwicklung von Webanwendungen stoßen wir häufig auf Szenarien, in denen mehrere Anfragen gleichzeitig gestellt werden.

In diesem Fall haben wir normalerweise zwei Ansätze:

  • Sie können bei der Anforderung einen Ladebildschirm anzeigen, um Benutzeroperationen zu verhindern.
  • Oder fügen Sie manuell eine Variable hinzu, um eine Anfrage zu drosseln

In unseren Projekten kommen aktuell überwiegend die beiden oben genannten Methoden zum Einsatz. Heute möchte ich eine neue Methode vorstellen.

2. CancelToken-Klasse

Wir haben zuvor ein Promise instanziiert. Ob dieses Objekt erfolgreich ist oder nicht, lässt sich außerhalb der Funktion nicht feststellen. Hier müssen wir einen kleinen Trick anwenden, um ein Promise von seiner Lösung zu trennen. Die Lösung kann jederzeit ausgelöst werden:

  // ein Versprechen
  lass das Versprechen auflösen
  let p = neues Versprechen((lösen, ablehnen) => {
    resolvePromise = lösen
  })
  // Dies führt resolvePromise() extern aus

Ok, unter dieser Prämisse müssen wir die Klasse axios.CancelToken verwenden.

Diese Klasse entspricht dem Öffnen eines weiteren Promises bei jeder Anfrage und dem Bilden eines Promise.race (Anfrage p1, Anfrage p2 abbrechen). Die Resolve-Methode im Promise wird einer externen Variable zum Empfangen zugewiesen. Wir können je nach Nachfrage manuell entscheiden, ob die vorherige Anfrage storniert werden soll. Tatsächlich ähnelt dies dem Promise.race, das wir geschrieben haben, als die Zeitüberschreitung der Fetch-Kapselungsschnittstelle aufgetreten ist.

cancelToken stellt auch eine entsprechende statische Methodenquelle zum Generieren eines cancelTokens und einer Cancel-Methode bereit, die eigentlich eine Lösung dieses Versprechens darstellt.

    CancelToken.source = Funktion Quelle() {
    var abbrechen;
    // 
    var token = neues CancelToken(Funktion Executor(c) {
        abbrechen = c;
    });
    zurückkehren {
        Zeichen: Zeichen,
        abbrechen: abbrechen,
    };

Gemäß unserer üblichen Caching-Methode können wir eine Karte deklarieren, um die URL jeder Anforderung und die entsprechende Abbruchmethode zu speichern.

    //Eine globale Karte deklarieren
    const pendingHttp = neue Map()
    // In Axios integrierte CancelToken-Klasse const CancelToken = axios.CancelToken
       
    Funktion addApi (Konfiguration) {
      config.cancelToken = neues CancelToken((abbrechen) => {
        const url = konfiguration.url
        console.log(pendingHttp)
        wenn (!pendingHttp.has(url)) {
          pendingHttp.set(url, abbrechen)
        }
      })
    }

    Funktion cancelApi (Konfiguration) {
      const url = konfiguration.url
      if (pendingHttp.has(url)) { // Wenn die aktuelle Anforderungskennung im ausstehenden Zustand vorhanden ist, müssen Sie die aktuelle Anforderung abbrechen und const cancel = pendingHttp.get(url) entfernen.
        Abbrechen (URL + „abgebrochen“)
        pendingHttp.delete(url) // Cache der aktuellen URL leeren}
    }
  • Achten Sie besonders darauf, dass Sie, wenn Sie eine Anfrage stornieren möchten, der Konfiguration das Attribut „cancelToken“ hinzufügen und es einer Instanz von „CancelToken“ zuweisen müssen. Andernfalls ist eine Stornierung nicht möglich.

Versuchen Sie wie beim Bedienen eines Timers, den vorherigen abzubrechen, bevor Sie den nächsten starten.

    httpService.interceptors.request.use(config => {

      cancelApi(Konfiguration)
      addApi(Konfiguration)
      
      // Beim lokalen Debuggen handelt es sich um eine domänenübergreifende Situation und das Hinzufügen eines Anforderungsheaders unterliegt Einschränkungen (der Projektcode ist hier irrelevant).
      const { headers = {} } = konfiguration; const { globalObj = {} } = fenster
      Objekt.assign(headers, globalObj, { from })
      
      Konfiguration zurückgeben
    }, Fehler => {
      console.log(Fehler)
      returniere Promise.reject(Fehler)
    })

Dann besteht eine weitere Möglichkeit, dass die erste Anfrage zurückgegeben wurde und dieselbe Anfrage erneut initiiert wird. Daher ist in der Antwort auch „cancelApi“ erforderlich.

    httpService.interceptors.response.use(
      Antwort => {
        cancelApi(response.config)
        sentryCatchApi (Antwort)
      },
      Fehler => {
        // Anforderungs-Timeoutif (error.message.includes('timeout')) { // Bestimmen Sie, ob die Anforderungsausnahmeinformationen die Timeout-Zeichenfolge enthalten: Toast.error({ text: 'Timeout der Webseitenanforderung, bitte aktualisieren und erneut versuchen~' })
        }
        sentryCatchApi(Fehler)
        returniere Promise.reject(Fehler)
      }
    )

Wir müssen beachten, dass Abbrechen eigentlich Auflösen bedeutet. Die Parameter, die beim Abbrechen der Ausführung übergeben werden, werden schließlich als Parameter im Fehlerrückruf der Antwort zurückgegeben, sodass unsere Fehlererfassungsmethode möglicherweise einen Fehler meldet.

    // Nehmen wir an, dass unsere Fehlermethode wie folgt gekapselt ist. Werfen wir einen Blick auf sentryCatchApi
    Fehler => {
      sentryCatchApi(Fehler)
      returniere Promise.reject(Fehler)
    }
  // Weil diese Methode ein Objekt empfangen muss, aber wenn wir die Anforderung abbrechen, wird eine Zeichenfolge zurückgegeben und ein Fehler gemeldet.
  Funktion sentryCatchApi (res) {
      versuchen {
        res = res || {}
        const resData = res.data || {}
        Sentry.captureException(JSON.stringify(resData))
        konsole.log(`
          Daten konnten nicht abgerufen werden:
          Bitte öffnen Sie die Adresse der Webansicht im Browser und fügen Sie sie ein, um die Fehlerbehebung zu erleichtern: Informationen zur Schnittstelle:
          Schnittstellenadresse: ${res.config.url},
          Rückgabewert der Schnittstelle: Code: ${resData.code},
          Nachricht:${resData.message},
          Daten: ${JSON.stringify(resData.data)}
        `)
      } fangen (Fehler) {
        console.error(fehler)
      }
    }

Sie müssen die isCancel-API verwenden

   Fehler => {
    if (axios.isCancel(error)) return console.log('Die Anfrage wurde abgebrochen', error.message)
    sentryCatchApi(Fehler)
    returniere Promise.reject(Fehler)
  }

Endergebnis

Es liegt kein Fehler in der Konsole vor. (Soll später im Projekt verbessert werden)

Zusammenfassen

Dies ist das Ende dieses Artikels über die Verwendung von Axios zum Filtern wiederholter Anfragen in einem Projekt. Weitere Informationen zum Filtern wiederholter Anfragen mit Axios 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:
  • Axios storniert Anfragen und vermeidet doppelte Anfragen
  • Axios storniert wiederholte Anfragen
  • So stornieren Sie wiederholte und nutzlose Anfragen in Axios
  • Vue Axios wiederholtes Klicken bricht die letzte Anforderungskapselungsmethode ab
  • Eine kurze Diskussion über die Lösung von Axios zum Entfernen doppelter Anfragen

<<:  Probleme bei der Ausführungsreihenfolge von AND und OR in SQL-Anweisungen

>>:  Eine detaillierte Einführung in die drei Installationsmethoden von RPM, Yum und Quellcode unter Linux

Artikel empfehlen

Ubuntu-Terminal, mehrere Fenster, geteilter Bildschirm, Terminator

1. Installation Das größte Feature von Terminator...

Der Unterschied zwischen HTML-Iframe und Frameset_PowerNode Java Academy

Einführung 1. <iframe>-Tag: Ein Iframe ist ...

So erweitern Sie den Linux-Swap-Speicher

Swap-Speicher bedeutet hauptsächlich, dass das Sy...

Verwendung von Vue3-Seiten, Menüs und Routen

Inhaltsverzeichnis 1. Klicken Sie auf das Menü, u...

Spezifische Verwendung von MySQL-Operatoren (und, oder, in, nicht)

Inhaltsverzeichnis 1. Einleitung 2. Haupttext 2.1...

Implementierung der Formularübermittlung in HTML

Formularübermittlungscode 1. Quellcode-Analyse &l...

Verwenden von Shadowsocks zum Erstellen eines transparenten LAN-Gateways

Inhaltsverzeichnis Installieren und konfigurieren...