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:
In unseren Projekten kommen aktuell überwiegend die beiden oben genannten Methoden zum Einsatz. Heute möchte ich eine neue Methode vorstellen. 2. CancelToken-KlasseWir 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} }
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) } EndergebnisEs liegt kein Fehler in der Konsole vor. (Soll später im Projekt verbessert werden) ZusammenfassenDies 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:
|
<<: Probleme bei der Ausführungsreihenfolge von AND und OR in SQL-Anweisungen
Inhaltsverzeichnis Status Quo Lösung Weitere Lösu...
1. Installation Das größte Feature von Terminator...
Einführung 1. <iframe>-Tag: Ein Iframe ist ...
Die Konfiguration ist sehr einfach, aber ich muss...
Dataframe ist eine neue API, die in Spark 1.3.0 e...
Swap-Speicher bedeutet hauptsächlich, dass das Sy...
Inhaltsverzeichnis 1. Klicken Sie auf das Menü, u...
Relativer Pfad – ein Verzeichnispfad, der basieren...
Als eines der beliebtesten Front-End-Frameworks i...
1. Replikationsprinzip Der Masterserver schreibt ...
Inhaltsverzeichnis 1. Einleitung 2. Haupttext 2.1...
Formularübermittlungscode 1. Quellcode-Analyse &l...
Netzwerk-Ports freigeben Tatsächlich gibt es in D...
Im vorherigen Artikel haben wir die Netzwerkerken...
Inhaltsverzeichnis Installieren und konfigurieren...