Beispielcode für die Verwendung von js zur Implementierung gleichzeitiger Ajax-Anfragen, um die Anzahl der Anfragen zu begrenzen

Beispielcode für die Verwendung von js zur Implementierung gleichzeitiger Ajax-Anfragen, um die Anzahl der Anfragen zu begrenzen

Problembeschreibung: Wenn die Anzahl der asynchronen Anforderungen ungewiss ist, um die Ansammlung unzähliger Aufrufstapel und Speicherüberlaufprobleme zu verhindern, wenn Hunderte von HTTP-Anforderungen gleichzeitig auftreten.

Anforderungen: Begrenzen Sie die Anzahl gleichzeitiger Anfragen auf weniger als 3 und erhalten Sie die Antwortergebnisse so schnell wie möglich.

Dieselbe Interviewfrage:

Implementieren Sie eine Batch-Anforderungsfunktion multiRequest(urls, maxNum) mit den folgenden Anforderungen:

  • Erfordert die maximale Anzahl gleichzeitiger Verbindungen maxNum
  • Bei jeder Rückgabe einer Anfrage bleibt ein Platz zum Hinzufügen einer neuen Anfrage offen.
  • Nachdem alle Anfragen abgeschlossen sind, werden die Ergebnisse in der Reihenfolge der URLs ausgedruckt.

1. Implementierung von seriellem und parallelem Ajax basierend auf Promise.all

Normalerweise werden asynchrone Anfragen basierend auf Versprechen gekapselt.

Seriell: Nachdem eine asynchrone Anfrage abgeschlossen ist, wird die nächste Anfrage gestellt

Parallelität: Mehrere asynchrone Anfragen werden gleichzeitig verarbeitet

Beispiel: Seriell

var p = Funktion () {
 returniere neues Promise(Funktion (auflösen, ablehnen) {
  setzeTimeout(() => {
   konsole.log('1000')
   lösen()
  }, 1000)
 })
}
var p1 = Funktion () {
 returniere neues Promise(Funktion (auflösen, ablehnen) {
  setzeTimeout(() => {
   konsole.log('2000')
   lösen()
  }, 2000)
 })
}
var p2 = Funktion () {
 returniere neues Promise(Funktion (auflösen, ablehnen) {
  setzeTimeout(() => {
   konsole.log('3000')
   lösen()
  }, 3000)
 })
}


p().dann(() => {
 return p1()
}).then(() => {
 return p2()
}).then(() => {
 console.log('Ende')
})

parallel:

var Versprechen = Funktion () {
 return [1000, 2000, 3000].map(aktuell => {
  returniere neues Promise(Funktion (auflösen, ablehnen) {
   setzeTimeout(() => {
    console.log(aktuell)
   }, aktuell)
  })
 })
}

Versprechen.alle(Versprechen()).dann(() => {
 console.log('Ende')
})

Versprechen.alles(Versprechen: []).dann(Spaß: Funktion);

promise.all stellt sicher, dass alle Promise-Objekte im Array den aufgelösten Zustand erreichen, bevor der then-Callback ausgeführt wird.

Promise.all Parallelitätslimit

Bedeutung: Dies bedeutet, dass die Anzahl der zu jedem Zeitpunkt gleichzeitig ausgeführten Versprechen festgelegt ist und das endgültige Ausführungsergebnis mit dem ursprünglichen Versprechen übereinstimmt.

Ideen und Umsetzung

Dies wird durch rekursive Aufrufe und die Festlegung einer maximalen Anzahl von Anfragen implementiert. Und jede dieser Anfragen sollte nach Abschluss weiterhin rekursiv gesendet werden, und die spezifische URL in URLs wird durch den übergebenen Index bestimmt, um sicherzustellen, dass die endgültige Ausgabereihenfolge nicht durcheinander gerät, sondern in der richtigen Reihenfolge ausgegeben wird

Code-Implementierung:

Funktion multiRequest(urls = [], maxNum) {
 //Gesamtzahl der Anfragen const len ​​= urls.length;
 // Erstellen Sie ein Array, um die Anforderungsergebnisse basierend auf der Anzahl der Anforderungen zu speichern const result = new Array(len).fill(false);
 // Aktuell abgeschlossene Zahl let count = 0;

 returniere neues Promise((lösen, ablehnen) => {
  // maxNum anfordern while (Anzahl < maxNum) {
   nächste();
  }
  Funktion nächstes() {
   sei aktuell = Anzahl++;
   // Randbedingungen behandeln if (current >= len) {
    // Sobald alle Anfragen abgeschlossen sind, setzen Sie das Versprechen auf einen erfolgreichen Status und geben Sie dann das Ergebnis als Versprechenswert zurück!result.includes(false) und resolve(result);
    zurückkehren;
   }
   const url = urls[aktuell];
   console.log(`start ${current}`, neues Date().toLocaleString());
   abrufen (URL)
    .then((res) => {
     // Anfrageergebnis speichern result[current] = res;
     console.log(`Abgeschlossen${current}`, neues Date().toLocaleString());
     // Wenn die Anfrage nicht abgeschlossen ist, rekursiere if (current < len) {
      nächste();
     }
    })
    .catch((err) => {
     console.log(`Ende ${current}`, neues Date().toLocaleString());
     Ergebnis[aktuell] = Fehler;
     // Wenn die Anfrage nicht abgeschlossen ist, rekursiere if (current < len) {
      nächste();
     }
    });
  }
 });
}

Code-Implementierung:

  // Aufgabenliste->Neue Aufgabe uploadFile() {
   lass _this = dies;
   var uploadThreadLimitNums = 3,
    uploadThreadNums = 0,
    sendFinishNum = 0,
    ErgebnisZielNummer = 0;
   Var-Markierungen = 0;
   var Aufgaben = [];
   var hochladen = Funktion () {
    während (uploadThreadNums < uploadThreadLimitNums) {
     if (sendFinishNum >= _this.fileList.length) {
      wenn (ErgebnisZielnummer >= _diese.Dateiliste.Länge) {
       creatTask(); // Anfrage abschließen}
      zurückkehren;
     }
     (Funktion (j) {
      Füge die folgende Dateiliste hinzu:
      let p = neue FormData();
      p.append("Datei", Element);
      Aufgaben.push(
       axios({
        Methode: "post",
        URL: `${window.UL_CONFIG.BASEURL}/api/files/upload`,
        Daten: p,
        beiUploadProgress: (progressEvent) => {
         für (lass i in _this.rowData) {
          _this.rowData[i].name === Artikel.name
           ? (_this.rowData[i].percent = Math.round(
             (Fortschrittsereignis.geladen / Fortschrittsereignis.gesamt) * 100
            ))
           : "";
         }
        },
       })
        .then((res) => {
        /* let obj = {};
         obj.url = `${window.UL_CONFIG.BASEURL}/api/files/${res.data}`;
         obj.Dateiname = Elementname;
         obj.fmt = _this.ruleForm.format;
         obj.samplingRate = _this.ruleForm.samplingRate;
         fileUrls.push(obj); */
        })
        .catch((e) => {
           ? (_this.rowData[i].Prozent = 0)
         _this.$notify.error({
          Titel: "Fehler",
          Meldung: „Dienstverbindungsfehler“ + item.name + „Upload fehlgeschlagen“,
         });
        .finally(() => {
         ThreadNums hochladen--;
         ErgebnisZielNum++;
         hochladen();
      );
     })(sendFinishNum);
     ThreadNums++ hochladen;
     sendFinishNum++;
    }
   };
   var createTask = Funktion () {
    axios.all(tasks).then((res) => {
     //Neue Upload-Aufgabe erstellen/* let fd1, fd2, calcFlag, flagArr, language;
     fd1 = {};
     flagArr = Objekt.assign([], _this.ruleForm.checkList);
     if (_this.ruleForm.recognize == "Automatische Erkennung") {
      flagArr.push("2");
     calcFlag = flagArr.reduce(
      (Akku, aktuell) => Zahl(Akku) + Zahl(aktuell)
     );
     _this.ruleForm.recognize == "Automatisch erkennen"
      ? (Sprache = "")
      : (Sprache = _this.ruleForm.erkennen);
     fd1.Prozessinhalt = calcFlag;
     fd1.remark = _this.ruleForm.remark;
     fd1.name = _this.ruleForm.taskName;
     fd1.fmt = _this.ruleForm.format;
     fd1.samplingRate = _this.ruleForm.samplingRate;
     fd1.language = Sprache;
     fd1.type = 1; // Typ: 1 Audio, 2 Video fd1.files = fileUrls; */
     neueAufgabe(fd1).then((res) => {
      /* _this.cmpltBtnState = false;
      _this.$store.commit("setTaskId", res.data.id);
      _this.submitFailNumber = res.data.submitFailNumber; */
      _this.$parent.dataInit();
     });
    });
   hochladen();
  },

Damit ist dieser Artikel über die Verwendung von js zur Implementierung von Beispielcode zur Begrenzung der Anzahl gleichzeitiger Ajax-Anfragen abgeschlossen. Weitere Informationen zur Begrenzung gleichzeitiger js-Ajax-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:
  • js implementiert Axios Limit-Anforderungswarteschlange
  • So verwenden Sie Promise in JavaScript, um die Anzahl gleichzeitiger Anfragen zu steuern
  • gin JSON-Text der Post-Anforderung abrufen
  • JS implementiert Anforderungsdispatcher
  • PHP implementiert die Konvertierung von Chrome-Formularanforderungsdaten in JSON-Daten, die von der Schnittstelle verwendet werden
  • Detaillierte Erläuterung mehrerer Lösungen für JavaScript-Unterbrechungsanforderungen

<<:  Spezifische Verwendung von GNU Parallel

>>:  MySQL-Entwicklungsleistungsforschung: Optimierungsmethode zum Batch-Einfügen von Daten

Artikel empfehlen

Implementierung zum Zeichnen einer Audio-Wellenform mit wavesurfer.js

1. Sehen Sie sich die Renderings an Weiterleiten ...

Zusammenfassung der MySQL-Injection-Bypass-Filtertechniken

Schauen wir uns zunächst den GIF-Vorgang an: Fall...

Detaillierte Einführung in die Grundkonzepte von JS

Inhaltsverzeichnis 1. Eigenschaften von JS 1.1 Mu...

Detaillierte Erläuterung der sieben Wertübertragungsmethoden von Vue

1. Vom Vater zum Sohn Definieren Sie das props Fe...

Der Unterschied zwischen div und span in HTML (Gemeinsamkeiten und Unterschiede)

Gemeinsamkeiten: Das DIV-Tag und das SPAN-Tag beh...

HTML+CSS zum Erstellen einer Schaltfläche im Cyberpunk-Stil

Erster Blick auf die Wirkung: Vorwort: Auf diese ...

So behandeln Sie den vom Linux-System gemeldeten Fehler tcp_mark_head_lost

Problembeschreibung Kürzlich meldete ein Host die...

HTML ist eigentlich die Anwendung zum Erlernen mehrerer wichtiger Tags

Nachdem der Artikel „Dies wird eine Revolution“ er...

Detaillierte Erklärung der Gründe, warum MySQL-Verbindungen hängen bleiben

Inhaltsverzeichnis 1. Hintergrund Architektur Pro...

Der Vue.js-Cloud-Speicher realisiert die Bild-Upload-Funktion

Vorwort Tipp: Das Folgende ist der Hauptinhalt di...

Detaillierte Zusammenfassung der Übermittlungsmethoden für Webformulare

Sehen wir uns zunächst verschiedene Möglichkeiten...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.5.27 winx64

1. Installationspaket MySQL-Dienst-Downloadadress...