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
Gespeicherte Prozeduren und Codierung Wenn in ges...
Wenn für MySQL 5.5 der Zeichensatz nicht festgele...
Inhaltsverzeichnis 1. Einleitung 2. Rekursion 3. ...
In diesem Artikel wird der spezifische Code von R...
1. Befehlseinführung Mit dem Befehl seq (Sequence...
Bei der Verwendung von MySQL werden Daten im Allg...
Problembeschreibung: Nach der Ausführung von dock...
In diesem Artikelbeispiel wird der spezifische Ja...
In diesem Artikel finden Sie das grafische Tutori...
Blockelement p - Absatz Text vorformatieren Tisch ...
Inhaltsverzeichnis 1. Speichermodell und Laufzeit...
Linux-Befehl „col“ Der Linux-Befehl col wird zum ...
Im Tabellenkopf können Sie die Farbe der hellen U...
Verwenden Sie div, um eine Maske zu erstellen oder...
Während der Projektentwicklung werden unsere Date...