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

Schreiben Sie einen formellen Blog mit XHTML CSS

Der vollständige Name von Blog sollte Weblog sein...

Ein Artikel zeigt Ihnen, wie Sie mit React ein Rezeptsystem implementieren

Inhaltsverzeichnis 1. Rezeptsammlung 1.1 Projekth...

Zusammenfassung der Fallstricke bei Virtualbox Centos7 NAT+Host-Only-Netzwerken

Inhaltsverzeichnis 1. Problemhintergrund 2. Welch...

Detaillierte Erklärung der KeepAlive-Verwendung in der Vue-Frontend-Entwicklung

Inhaltsverzeichnis Vorwort Keep-Avlive-Hook-Funkt...

Lösung zur Bereinigung des Docker-Festplattenspeichers

Vor einiger Zeit stieß ich auf das Problem, dass ...

Anweisungen zur Verwendung von JSON-Operationsfunktionen in Mysql5.7

Vorwort JSON ist ein leichtes Datenaustauschforma...

Was tun, wenn Sie Ihr Linux/Mac MySQL-Passwort vergessen?

Was tun, wenn Sie Ihr Linux/Mac MySQL-Passwort ve...

MySQL Online-DDL-Tool Gh-Ost-Prinzipanalyse

Inhaltsverzeichnis 1. Einleitung 1.1 Grundsatz 1....

Zusammenfassung ungewöhnlicher Operatoren und Operatoren in js

Zusammenfassung gängiger Operatoren und Operatore...

Eine elegantere Methode zur Fehlerbehandlung in JavaScript async await

Inhaltsverzeichnis Hintergrund Warum Fehlerbehand...

CSS fügt Scroll zu Div hinzu und verbirgt die Bildlaufleiste

CSS fügt dem div Scrollen hinzu und verbirgt die ...

Grafisches Tutorial zur Installation und Konfiguration von Mysql WorkBench

In diesem Artikel erfahren Sie mehr über die Inst...