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:
1. Implementierung von seriellem und parallelem Ajax basierend auf Promise.allNormalerweise 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ätslimitBedeutung: 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:
|
<<: Spezifische Verwendung von GNU Parallel
>>: MySQL-Entwicklungsleistungsforschung: Optimierungsmethode zum Batch-Einfügen von Daten
1. Sehen Sie sich die Renderings an Weiterleiten ...
Schauen wir uns zunächst den GIF-Vorgang an: Fall...
Inhaltsverzeichnis 1. Eigenschaften von JS 1.1 Mu...
Vor ein paar Tagen habe ich auf Codepen ein Beisp...
1. Vom Vater zum Sohn Definieren Sie das props Fe...
Gemeinsamkeiten: Das DIV-Tag und das SPAN-Tag beh...
Erster Blick auf die Wirkung: Vorwort: Auf diese ...
Problembeschreibung Kürzlich meldete ein Host die...
Nachdem der Artikel „Dies wird eine Revolution“ er...
Inhaltsverzeichnis 1. Hintergrund Architektur Pro...
Vorwort Tipp: Das Folgende ist der Hauptinhalt di...
Verwenden Sie HTML, um komplexe Tabellen zu erste...
Sehen wir uns zunächst verschiedene Möglichkeiten...
Wie lassen sich Kompatibilitätsprobleme mit virtu...
1. Installationspaket MySQL-Dienst-Downloadadress...