1. Einleitung Dieser Artikel beschreibt die Lösungen für asynchrone Funktionen, serielle Ausführung und parallele Ausführung in 2. es5-Methode Bevor es6 herauskam, hatte die 3. Asynchrone Funktionsserienausführungvar Elemente = [ 1, 2, 3, 4, 5, 6 ]; var Ergebnisse = []; Funktion async(Argument, Rückruf) { console.log('Parameter ist ' + arg +', gibt Ergebnis nach 1 Sekunde zurück'); setTimeout(Funktion () { Rückruf(Argument * 2); }, 1000); } Funktion final(Wert) { console.log('Abgeschlossen: ', Wert); } Funktion Serie(Element) { wenn(Artikel) { async(Element, Funktion(Ergebnis) { Ergebnisse.push(Ergebnis); return series(items.shift()); // alle Daten rekursiv ausführen }); } anders { return final(Ergebnisse[Ergebnisse.Länge - 1]); } } Serie (Elemente.Shift()); 4. Parallele Ausführung asynchroner Funktionen Die oben genannten Funktionen werden nacheinander ausgeführt, und die nächste wird ausgeführt, nachdem die vorherige abgeschlossen ist. Dies ähnelt async und await in Wir können schreiben: var Elemente = [ 1, 2, 3, 4, 5, 6 ]; var Ergebnisse = []; Funktion async(Argument, Rückruf) { console.log('Parameter ist ' + arg +', gibt Ergebnis nach 1 Sekunde zurück'); setTimeout(Funktion () { Rückruf(Argument * 2); }, 1000); } Funktion final(Wert) { console.log('Abgeschlossen: ', Wert); } items.forEach(Funktion(Element) {// Schleife abgeschlossen async(Element, Funktion(Ergebnis){ Ergebnisse.push(Ergebnis); if(results.length === items.length) {// Bestimmen Sie, ob die Anzahl der abgeschlossenen Funktionen der Anzahl der auszuführenden Funktionen entspricht final(results[results.length - 1]); } }) }); 5. Kombination der seriellen und parallelen Ausführung asynchroner FunktionenWenn viele asynchrone Daten (Hunderte davon) parallel ausgeführt werden und jede asynchrone Datei viele (https-)Anforderungsdaten enthält, führt dies zwangsläufig zu unzureichenden TCP-Verbindungen oder zur Ansammlung unzähliger Aufrufstapel, was zu einem Speicherüberlauf führt. Da es nicht einfach ist, zu viele Daten parallel auszuführen, entstand eine Kombination aus parallelen und seriellen Methoden. Der Code kann wie folgt geschrieben werden: var Elemente = [ 1, 2, 3, 4, 5, 6 ]; var Ergebnisse = []; var läuft = 0; Variablenlimit = 2; Funktion async(Argument, Rückruf) { console.log('Parameter ist ' + arg +', gibt Ergebnis nach 1 Sekunde zurück'); setTimeout(Funktion () { Rückruf(Argument * 2); }, 1000); } Funktion final(Wert) { console.log('Abgeschlossen: ', Wert); } Funktion Launcher() { während(läuft < Limit && Elemente.Länge > 0) { var item = items.shift(); async(Element, Funktion(Ergebnis) { Ergebnisse.push(Ergebnis); läuft--; wenn (Elementlänge > 0) { Trägerrakete(); } sonst wenn(läuft == 0) { endgültige(Ergebnisse); } }); läuft++; } } Trägerrakete(); 6. es6-Methode winziger asynchroner Pool, ES6-Promise-Pool, P-Limit Einfache Kapselung einer Lösungsfunktion Funktion PromiseLimit(funcArray, limit = 5) { // 5 Daten gleichzeitig ausführen let i = 0; const Ergebnis = []; const wird ausgeführt = []; const Warteschlange = Funktion() { wenn (i === funcArray.length) return Promise.all(wird ausgeführt); const p = funcArray[i++](); Ergebnis.push(p); const e = p.then(() => ausführen.splice(ausführen.indexOf(e), 1)); Ausführen von Push(e); wenn (Ausführungslänge >= Limit) { returniere Promise.race(Ausführen).dann( () => Warteschlange(), e => Versprechen.ablehnen(e) ); } gibt Promise.resolve().then(() => queue()) zurück; }; returniere queue().then(() => Promise.all(Ergebnis)); } verwenden: // Testcode const result = []; für (let index = 0; index < 10; index++) { Ergebnis.push(Funktion() { returniere neues Promise((lösen, ablehnen) => { console.log("start" + index, neues Date().toLocaleString()); setzeTimeout(() => { auflösen (Index); console.log("Ende" + index, neues Date().toLocaleString()); }, parseInt(Math.random() * 10000)); }); }); } PromiseLimit(Ergebnis).dann(Daten => { konsole.log(Daten); }); Ändern Sie den Testcode und fügen Sie eine Zufallsfehlerlogik hinzu // Ändern Sie den Testcode, sodass er nach dem Zufallsprinzip fehlschlägt oder erfolgreich ist const result = []; für (let index = 0; index < 10; index++) { Ergebnis.push(Funktion() { returniere neues Promise((lösen, ablehnen) => { console.log("start" + index, neues Date().toLocaleString()); setzeTimeout(() => { wenn (Math.random() > 0,5) { auflösen (Index); } anders { ablehnen(index); } console.log("Ende" + index, neues Date().toLocaleString()); }, parseInt(Math.random() * 1000)); }); }); } PromiseLimit(Ergebnis).dann( Daten => { console.log("Erfolg", Daten); }, Daten => { console.log("fehlgeschlagen", Daten); } ); 7. async und await kombiniert mit promise allasynchrone Funktion PromiseAll(promises,batchSize=10) { const Ergebnis = []; während(Versprechen.Länge > 0) { const data = warte auf Promise.all(promises.splice(0,batchSize)); Ergebnis.push(...Daten); } Ergebnis zurückgeben; } Es gibt zwei Probleme mit diesem Schreiben:
Die Verbesserungen sind wie folgt: asynchrone Funktion asyncPool(Array,PoolLimit,IteratorFn) { Konstanten ret = []; const wird ausgeführt = []; für (const Element des Arrays) { const p = Promise.resolve().then(() => iteratorFn(item, array)); ret.push(p); wenn (PoolLimit <= Array.Länge) { const e = p.then(() => ausführen.splice(ausführen.indexOf(e), 1)); Ausführen von Push(e); wenn (Ausführungslänge >= PoolLimit) { warte auf Promise.race (Ausführung); } } } gibt Promise.all(ret) zurück; } verwenden: const timeout = i => neues Versprechen(auflösen => setTimeout(() => auflösen(i), i)); return asyncPool( [1000, 5000, 3000, 2000], 2,timeout).dann(Ergebnisse => { ... }); Dies ist das Ende dieses Artikels über serielle und parallele Operationen in asynchronen JavaScript-Operationen. Weitere relevante Inhalte zu seriellen und parallelen Operationen in asynchronen JavaScript-Operationen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: HTML css js implementiert Tab-Seite Beispielcode
Bei der Verwendung von Vue zur Entwicklung von Pr...
Inhaltsverzeichnis Gesamteffekt Achten Sie auf Co...
Derzeit nutzen die meisten Linux-Benutzer entwede...
In diesem Artikelbeispiel wird der spezifische Co...
transformieren und übersetzen Transformieren bezi...
Das CentOS-Projekt, ein 100 % kompatibler Neuaufb...
1. Stoppen Sie zuerst den Datenbankserver Dienst ...
Vorwort Die Schlüsselwörter von MySQL und Oracle ...
mycli MyCLI ist eine Befehlszeilenschnittstelle f...
Inhaltsverzeichnis Überblick Was sind Rückrufe od...
MySQL-Abfrage ohne Verwendung der Indexaggregatio...
Aus geschäftlichen Gründen kommt es häufig zu Eil...
Das <canvas>-Element ist für clientseitige ...
Inhaltsverzeichnis 1. Reagieren Grundlegende Verw...
Virtuelle Maschinen sind eine sehr praktische Tes...