1. Warum diesen Artikel schreiben? Sie haben sicherlich viele Artikel zum Umgang mit doppelten Anfragen gelesen. Die meisten davon sind in zwei Versionen unterteilt: Zurückgeben doppelter Anfragen, bevor die Antwort zurückgegeben wird, und Verwenden von Drosselung/Anti-Shake, um häufige Benutzervorgänge indirekt zu vermeiden. Bei der jüngsten Verwendung habe ich festgestellt, dass diese beiden Versionen in manchen Szenarien immer noch einige Einschränkungen aufweisen. 2. ProblemszenarioWie im Bild zu sehen, soll die Visitenkartenkomponente oben und unten auf meiner h5-Seite angezeigt werden. Die Informationen dieser Visitenkarten werden über eine Schnittstelle abgerufen. Wenn diese Komponente auf der aktuellen Seite initialisiert wird, treten zwei wiederholte Anforderungen auf. An diesem Punkt stehen Sie vor mehreren Entscheidungen: 1. Bearbeiten Sie keine doppelten Anfragen.
2. Doppelte Anfragen direkt zurückgeben. Dies wird auch in einigen Artikeln praktiziert, allerdings weist dieser Ansatz eine Einschränkung auf: Er bestimmt direkt, dass nachfolgende wiederholte Anfragen ungültige Anfragen sind.
3. Extrahieren Sie die Anforderung aus der Komponente, fügen Sie sie in die übergeordnete Unternehmensseite ein und übergeben Sie sie dann als Requisiten an die Komponente.
3. LösungKernidee
Diese Lösung kann für alles verwendet werden, unabhängig davon, ob Axios, JQ, Fetch oder Applet-Anfragen verwendet werden. Hier ist das Implementierungsprinzip. Wenn Sie es verwenden, fügen Sie einfach den entsprechenden Code zur entsprechenden Anforderungszeit ein. Codebeispiel let handleList = [] // Anfrageliste/** * Anfrage simulieren * @author waldon * @Datum 2020/6/9 */ const httpRequest = () => { returniere neues Promise((auflösen) => { setzeTimeout(() => { resolve(`Anfrage erfolgreich, Zeitstempel: ${new Date().getTime()}`) }, 1000) }) } /** * Anfragebezogene Verarbeitung * @author waldon * @Datum 2020/6/9 * @param {String} URL - * @param {Object} requestObj – Anforderungsparameter * @returns {Promise} – Anforderungsversprechen */ Funktion AnfrageTest(URL, AnfrageObj = {}) { // Da die Eingabeparameter im Allgemeinen keine komplexen Typen beinhalten, reicht JSON.stringify für den Serialisierungsvergleich aus. // Eine Einschränkung besteht darin, dass sich die Reihenfolge der Eingabeparameter ändert, was sich auf die Beurteilung auswirkt. Diese spezielle Änderung tritt jedoch im Allgemeinen bei wiederholten Anforderungen nicht auf. // Wenn eine solche Anforderung besteht, wechseln Sie zu anderen APIs für rekursive Vergleiche. Lodash hat auch ähnliche APIs. const sameHandle = handleList.find( (Artikel) => Artikel.URL === URL && JSON.stringify(Artikel.Anforderungsobjekt) === JSON.stringify(Anforderungsobjekt) ) wenn (gleicherHandle) { // Wenn dieselbe Anfrage auftritt, wird das Versprechen der vorherigen Anfrage direkt zurückgegeben console.log(`Es liegt eine doppelte Anfrage vor, kehren Sie direkt zurück`) returniere sameHandle.handle } const handle = neues Versprechen((lösen, ablehnen) => { httpRequest() .then((res) => { Entschlossenheit (res) }) .catch((err) => { ablehnen (Fehler) }) .finally(() => { // Unabhängig vom Anfrageergebnis muss die entsprechende Anfrage entfernt werden handleList = handleList.filter( (Artikel) => item.url !== url und JSON.stringify(item.requestObj) !== JSON.stringify(requestObj) ) }) }) handleList.push({ url, requestObj, handle }) Rückholgriff } // *******************************Ich fange an, die wunderschöne Trennlinie zu verwenden ********************************* Konstante Parameter = { Name: 'Waldon' } requestTest('/ajax/sameUrl', params).then((res) => { console.log(`Ergebnis der ersten Anfrage`, res) console.log(`handleList:`, handleList) }) requestTest('/ajax/sameUrl', params).then((res) => { console.log(`Anfrageergebnis wiederholen`, res) console.log(`handleList:`, handleList) // Es gibt immer nur eine Anfrage in der Anfrageliste setTimeout(() => { console.log(`handleList nach Abschluss der Anfrage:`, handleList) // Nachdem die Anfrage abgeschlossen ist, wird die der handleList entsprechende Anfrage gelöscht}, 100) }) setzeTimeout(() => { // Verzögern Sie die Anfrage um 500 ms, da wir die Schnittstelle so eingestellt haben, dass sie nach 1 s zurückkehrt. Daher sollten wir dasselbe Ergebnis erhalten requestTest('/ajax/sameUrl', params).then((res) => { console.log(`Anfrageergebnis wiederholen`, res) console.log(`handleList:`, handleList) }) }, 500) Ausgabe
Code-Adresse Codepen https://codepen.io/waldonUB/pen/ZEeeONM Zu beachtende Punkte
Dies ist das Ende dieses Artikels über die Verwendung von Promise in JavaScript zur Verarbeitung mehrerer wiederholter Anfragen. Weitere Informationen zu JS Promise-Anfragen mit mehreren wiederholten Anfragen 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 fragen Sie den minimal verfügbaren ID-Wert in der MySQL-Tabelle ab
Inhaltsverzeichnis Integritätsbeschränkungen Defi...
In diesem Artikel wird der spezifische JavaScript...
Inhaltsverzeichnis 1. Regel 1: Objekt.Methode() 1...
Entpacken Sie die Datei in ein Verzeichnis Dies i...
Das geschäftliche Social-Networking-Portal Linked...
Dieser Artikel installiert die Google-Eingabemeth...
1. Verschiedene CSS-Symbole Es gibt drei Möglichk...
Inhaltsverzeichnis Ereignisschleife Ereignisschle...
Wenn über dieses Problem gesprochen wird, fragen s...
Funktionen von SSHFS: Basierend auf FUSE (dem bes...
In diesem Artikel finden Sie das Installations-Tu...
Es gibt häufig Szenarien, in denen das Bild an di...
Verwenden Sie JS, um einen einfachen Rechner für ...
Inhaltsverzeichnis 1. Clevere Verwendung von Indi...
Vor einiger Zeit gab es auf TikTok eine Schüttela...