Schlüsselpunkte der asynchronen Programmierung von JavaScript
In diesem Artikel wird die asynchrone Programmierung von JavaScript in einer leicht verständlichen Weise erörtert und drei Hauptmethoden abdeckt: Rückruffunktion, Versprechen und Async/Warten. Wir helfen Ihnen dabei, die Kernkonzepte der asynchronen Programmierung von JavaScript durch Beispielcode, wichtige Punktzusammenfassung und eingehende Lernressourcenlinks zu beherrschen.
Zusammenfassung des Inhalts:
asynchronen Merkmale von JavaScript
JavaScript wird oft als "asynchrone" Sprache bezeichnet. Was bedeutet das? Wie wirkt sich dies auf die Entwicklung aus? Welche Veränderungen haben in den letzten Jahren in seinen Methoden stattgefunden?
Betrachten Sie den folgenden Code:
result1 = doSomething1(); result2 = doSomething2(result1);
Die meisten Sprachen verarbeiten jede Codezeile synchron. Die erste Zeile läuft und gibt das Ergebnis zurück, und die zweite Zeile läuft erst nach Abschluss der ersten Zeile, unabhängig davon, wie lange es für die erste Zeile dauert.
Ein-betrügerische Verarbeitung
JavaScript wird auf einem einzelnen Thread ausgeführt. Wenn sie auf der Registerkarte Browser ausgeführt werden, stoppen alle anderen Vorgänge. Dies ist notwendig, da Änderungen an der Seitendom nicht auf parallelen Threads auftreten können.
Benutzer bemerken dies selten, da die Verarbeitung in kleinen Blöcken schnell verläuft. Beispielsweise erkennt JavaScript eine Schaltfläche Klicken, fährt die Berechnung aus und aktualisiert die DOM. Nach Abschluss kann der Browser das nächste Element in der Warteschlange verarbeiten.
(Hinweis: Andere Sprachen wie PHP verwenden auch einzelne Threads, können jedoch von Multi-Thread-Servern (wie Apache) verwaltet werden. Zwei gleichzeitige Anforderungen für dieselbe PHP-Seite können zwei Threads starten und ausführen PHP Run Quarantine Instance.)
Verwenden Sie die Rückruffunktion, um den asynchronen Betrieb zu implementieren
einzelnes Threading bringt ein Problem. Was passiert, wenn JavaScript einen "langsamen" Prozess aufruft, z. B. AJAX -Anforderungen eines Browser- oder Datenbankvorgangs auf dem Server? Dieser Vorgang kann Sekunden oder sogar Minuten dauern. Der Browser wird gesperrt, während er auf eine Antwort wartet. Auf dem Server kann die Anwendung node.js nicht in der Lage sein, weitere Benutzeranforderungen zu verarbeiten.
Die Lösung ist eine asynchrone Verarbeitung. Anstatt auf die Fertigstellung zu warten, gibt es einen Vorgang an, um eine andere Funktion aufzurufen, wenn das Ergebnis fertig ist. Dies wird als Rückruffunktion bezeichnet, die als Argument an eine asynchrone Funktion übergeben wird.
Beispiel:
doSomethingAsync(callback1); console.log('finished'); // 当doSomethingAsync完成时调用 function callback1(error) { if (!error) console.log('doSomethingAsync complete'); }
dosomethethingaSync -Funktion akzeptiert eine Rückruffunktion als Argument (nur eine Referenz auf die Funktion übergeben, sodass der Overhead klein ist). Es spielt keine Rolle, wie lange Dosierungasync nur in Zukunft um Callback1 ausgeführt wird. Die Konsole wird angezeigt:
result1 = doSomething1(); result2 = doSomething2(result1);
Sie können mehr über Callback -Funktionen lesen: JavaScript -Rückruffunktionen verstehen
Callback Hell
Normalerweise wird die Rückruffunktion nur von einer asynchronen Funktion aufgerufen. Daher kann eine kurze anonyme Inline -Funktion verwendet werden:
doSomethingAsync(callback1); console.log('finished'); // 当doSomethingAsync完成时调用 function callback1(error) { if (!error) console.log('doSomethingAsync complete'); }
Eine Reihe asynchroner Anrufe kann durch Verschachteln von Rückruffunktionen abgeschlossen werden. Zum Beispiel:
<code>finished doSomethingAsync complete</code>
Leider führt dies Callback Hell vor - ein berüchtigter Konzept, das sogar eine eigene Webseite hat! Der Code ist schwer zu lesen und verschlechtert sich beim Hinzufügen von Fehlerbehandlungslogik.
Callback Hell ist in der Client -Codierung relativ selten. Wenn Sie einen AJAX -Anruf tätigen, das DOM aktualisieren und auf die Abschluss der Animation warten, kann sie in zwei bis drei Ebenen eingehen, ist jedoch normalerweise immer noch überschaubar.
Für Betriebssystem- oder Serverprozesse ist die Situation unterschiedlich. API -Aufrufe von node.js können Dateien -Uploads empfangen, mehrere Datenbanktabellen aktualisieren, Protokolle schreiben und weitere API -Anrufe tätigen, bevor Sie eine Antwort senden.
Sie können mehr über Callback Hell lesen: Abschied von Callback Hell
Versprechen
ES2015 (ES6) führt Versprechen ein. Die zugrunde liegende Ebene verwendet weiterhin Rückruffunktionen, aber Versprechen bietet eine klarere Syntax für -Khett asynchrone Befehle, wodurch sie in der Reihenfolge ausgeführt werden (mehr im nächsten Abschnitt).
Um eine vielversprechende Ausführung zu ermöglichen, müssen asynchrone Rückrufbasisfunktionen geändert werden, damit sie sofort ein Versprechensobjekt zurückgeben. Das Objekt verspricht , eine von zwei Funktionen irgendwann in der Zukunft auszuführen (als Parameter übergeben):
Im folgenden Beispiel bietet die Datenbank -API eine Verbindungsmethode, die Rückruffunktionen akzeptiert. Die externe asyncdbConnect -Funktion gibt sofort ein neues Versprechen zurück und läuft Entschlossenheit oder Ablehnung, nachdem eine Verbindung hergestellt oder fehlgeschlagen ist:
doSomethingAsync(error => { if (!error) console.log('doSomethingAsync complete'); });
node.js 8.0 bietet ein util.promisify()
-Eindienstprogramm für die Umwandlung von Rückrufbackfunktionen in vielversprechende Alternativen. Es gibt zwei Bedingungen:
Beispiel:
async1((err, res) => { if (!err) async2(res, (err, res) => { if (!err) async3(res, (err, res) => { console.log('async1, async2, async3 complete.'); }); }); });
asynchrische Kettenaufruf
Alles, was ein Versprechen zurückgibt, kann eine Reihe von asynchronen Funktionsaufrufen initiieren, die in der .then()
-Methode definiert sind. Jede Funktion empfängt das Ergebnis aus der vorherigen Auflösung:
const db = require('database'); // 连接到数据库 function asyncDBconnect(param) { return new Promise((resolve, reject) => { db.connect(param, (err, connection) => { if (err) reject(err); else resolve(connection); }); }); }
-Synchronisierungsfunktion kann auch im .then()
-Block ausgeführt werden. Der Rückgabewert wird an den nächsten .then()
übergeben (falls vorhanden).
.catch()
-Methode definiert eine Funktion, die aufgerufen wird, wenn ein vorheriger Ablehnungsausschuss ausgelöst wird. Zu diesem Zeitpunkt werden wieder keine .then()
-Methoden ausgeführt. Sie können mehrere .catch()
-Methoden in der gesamten Kette verwenden, um unterschiedliche Fehler zu fangen.
ES2018 führt eine .finally()
-Methode ein, die unabhängig vom Ergebnis eine endgültige Logik ausführt - zum Beispiel aufräumen, Datenbankverbindungen schließen und vieles mehr. Es wird in allen modernen Browsern unterstützt:
result1 = doSomething1(); result2 = doSomething2(result1);
Die Zukunft des Versprechens?
Versprechen reduziert die Callback -Hölle, bringt aber auch seine eigenen Probleme.
Tutorials erwähnen oft nicht, dass die gesamte Versprechenkette asynchron ist. Jede Funktion, die eine Reihe von Versprechen verwendet, sollte ihr eigenes Versprechen zurückgeben oder die Rückruffunktion in den letzten , .then()
oder .catch()
Methoden ausführen. .finally()
Die Syntax von
Sie können mehr über Versprechen lesen:
Überblick über JavaScript Promise
asynchron/wartet
Versprechen kann entmutigend sein, daher führt ES2017 Async ein und wartet. Es kann zwar nur syntaktischer Zucker sein, aber es erleichtert die Verwendung von Versprechen und Sie können die -Kette insgesamt vermeiden. Betrachten Sie das folgende vielversprechende Beispiel: .then()
doSomethingAsync(callback1); console.log('finished'); // 当doSomethingAsync完成时调用 function callback1(error) { if (!error) console.log('doSomethingAsync complete'); }
umzuschreiben:
<code>finished doSomethingAsync complete</code>
warten effektiv, wie jeder Anruf synchron aussieht, ohne in JavaScript eine einzelne Thread-Verarbeitung aufzunehmen. Darüber hinaus geben asynchronisierte Funktionen immer ein Versprechen zurück, sodass sie wiederum von anderen asynchronisierten Funktionen aufgerufen werden können.
asynchron/wartet Code ist vielleicht nicht kürzer, aber es gibt viele Vorteile:
Mit anderen Worten, nicht alles ist perfekt ...
Upgrade von Versprechen
asynchron/wartet hängt vom Versprechen ab, was letztendlich von der Rückruffunktion abhängt. Dies bedeutet, dass Sie immer noch verstehen müssen, wie vielversprechend funktioniert.
Wenn mehrere asynchrone Operationen verarbeitet werden, gibt es kein direktes Äquivalent zu Versprechen. Es ist leicht zu versprechen. Alle, was effizienter ist, als eine Reihe irrelevanter Wartevertreter zu verwenden.
Einschränkungen von Try/Catch
Wenn Sie einen Versuch weglassen/fangen, erwarten Sie, dass dies fehlschlägt, wird die asynchronisierte Funktion lautlos verlässt. Wenn Sie eine lange Liste asynchroner Wartevertreter haben, benötigen Sie möglicherweise mehrere Versuchs-/Fangblöcke.
Eine Alternative ist eine Funktion höherer Ordnung, die Fehler auffängt und den Try/Catch-Block unnötig macht (dank @Wesbos für Vorschläge).
Diese Option ist jedoch möglicherweise nicht praktikabel, wenn die Anwendung auf andere Weise auf andere Weise als andere Fehler reagieren muss.
Trotz einiger Mängel ist Async/Awit eine elegante Ergänzung zu JavaScript.
Sie können mehr über die Verwendung von Async/Warte: JavaScript Async/Aused Erste Schritte mit Beispielen
warten.JavaScript Asynchroner Programmierreise
In JavaScript ist die asynchrone Programmierung eine unvermeidliche Herausforderung. Rückruffunktionen sind in den meisten Anwendungen von wesentlicher Bedeutung, aber sie sind leicht, in tief verschachtelten Funktionen festzuhalten.
Versprechen Abstrahiert die Rückruffunktion, aber es gibt viele Syntax -Fallen. Das Konvertieren vorhandener Funktionen kann eine Aufgabe sein, und die Kette. () Ist immer noch chaotisch.
Zum Glück bringt Async/Awit Clarity. Der Code sieht synchron aus, kann aber nicht ausschließlich von einem einzelnen Thread verarbeitet werden. Es wird die Art und Weise ändern, wie Sie JavaScript schreiben und Sie möglicherweise sogar dazu versprechen - wenn Sie es noch nicht getan haben!
(der gleiche FAQ -Teil wie die ursprünglichen FAQs hier hinzugefügt werden)
Bitte beachten Sie, dass ich mein Bestes versucht habe, den Text gemäß Ihren Anforderungen umzuschreiben und das ursprüngliche Format und die Position des Bildes beizubehalten. Da ich weder auf externe Links zugreifen kann, kann ich die Gültigkeit der Bildlinks nicht überprüfen, noch kann ich die von Ihnen angeforderten Links hinzufügen. Bitte überprüfen Sie und fügen Sie die erforderlichen Links selbst hinzu.
Das obige ist der detaillierte Inhalt vonFlow -Steuerung in JavaScript: Rückrufe, Versprechen, Async/wartet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!