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

So ändern Sie den MySQL-Zeichensatz utf8 in utf8mb4

Wenn für MySQL 5.5 der Zeichensatz nicht festgele...

Teilen Sie 5 JS-High-Order-Funktionen

Inhaltsverzeichnis 1. Einleitung 2. Rekursion 3. ...

React realisiert sekundäre Verknüpfung (linke und rechte Verknüpfung)

In diesem Artikel wird der spezifische Code von R...

So verwenden Sie den Linux-Befehl seq

1. Befehlseinführung Mit dem Befehl seq (Sequence...

JavaScript zum Implementieren eines Dropdown-Listenauswahlfelds

In diesem Artikelbeispiel wird der spezifische Ja...

Zusammenfassung der Blockelemente, Inline-Elemente und variablen Elemente

Blockelement p - Absatz Text vorformatieren Tisch ...

Detaillierte Erläuterung des Speichermodells der JVM-Serie

Inhaltsverzeichnis 1. Speichermodell und Laufzeit...

27 Linux-Befehle zum Bearbeiten von Dokumenten, die es wert sind, gesammelt zu werden

Linux-Befehl „col“ Der Linux-Befehl col wird zum ...

Lösung für den Fehler, dass IE6 select nicht durch div abgedeckt werden kann

Verwenden Sie div, um eine Maske zu erstellen oder...

Zusammenfassung zum Sharding von MySQL-Datenbanken und -Tabellen

Während der Projektentwicklung werden unsere Date...