Was ist der Unterschied zwischen JavaScript verspricht und async erwarten?
Ich habe mit ECMAScript 6 und ECMAScript 7 Funktionen bereits (Dank Babel) für meine Anwendungen - sowohl für mobile und web.
Der erste Schritt war offenbar zu ECMAScript 6 Ebenen. Ich lernte viele async-patterns, die verspricht (die sind wirklich viel versprechend), Generatoren (nicht sicher, warum das * - symbol), etc.
Aus dieser, verspricht geeignet, meinen Zweck ziemlich gut. Und ich habe Sie in meinen Anwendungen ziemlich viel.
Hier ist ein Beispiel/pseudocode, wie ich es umgesetzt haben, ein grundlegendes Versprechen-
var myPromise = new Promise(
function (resolve,reject) {
var x = MyDataStore(myObj);
resolve(x);
});
myPromise.then(
function (x) {
init(x);
});
Als die Zeit verging, ich kam in ECMAScript 7 Funktionen, und einer von Ihnen ASYNC
und AWAIT
Stichwörter/Funktionen. Diese in Verbindung große Wunder. Ich habe angefangen, zu ersetzen einige meiner Versprechen mit async & await
. Sie scheinen fügen Sie großen Wert auf den Programmierstil.
Wieder, hier ist ein pseudocode, wie mein async, await-Funktion aussieht-
async function myAsyncFunction (myObj) {
var x = new MyDataStore(myObj);
return await x.init();
}
var returnVal = await myAsyncFunction(obj);
Halten die syntax-Fehler (wenn vorhanden) beiseite, beide von Ihnen tun genau das gleiche Ding ist, was ich fühle. Ich habe fast in der Lage gewesen, zu ersetzen, die meisten meiner Versprechen mit async,erwartet.
Warum ist async,await benötigt, wenn verspricht einem ähnlichen job?
Nicht async,await lösen Sie ein größeres problem? Oder war es nur eine andere Lösung, um callback-Hölle?
Wie ich bereits sagte, ich bin in der Lage zu verwenden verspricht und async,await, dieses problem zu lösen. Gibt es etwas bestimmtes, dass async-await gelöst?
Zusätzliche Hinweise:
Ich habe mit async,erwartet und verspricht in meine Projekte und Reagieren Node.js Module ausgiebig.
Reagieren vor allem war ein früher Vogel und nahm eine Menge von ECMAScript - 6 und ECMAScript 7 Funktionen.
- Der erste code-block zu verwenden scheint ein Versprechen für eine synchrone operation. Warum würden Sie das tun? Synchron ist, von der Natur, einfacher, code zu schreiben, so sollte es wenig Grund zu wickeln eine synchrone operation in eine Verheißung und Kraft, die es nun async.
- Ja, du hast Recht. Bearbeitet den code. Danke.
- Ihr versucht immer noch, die Verwendung von asynchronen tools mit synchronen Funktionen - nun in beiden code-Blöcke. Warum?
- Ok. Hier habe ich mein code gist.github.com/bozzmob/26d38b83dc37d1be37f5 . Bitte können Sie mir sagen, was mache ich falsch?
- Wo ist eine asynchrone operation in deinem code, ist, dass Sie nichts anderes als normale synchronous code?
- Bitte können Sie mir einen pseudo-code, so dass ich wissen kann, was ich falsch mache. Async-Betrieb Sinn?
- Es klingt wie Sie brauchen nur zu tun eine Menge zu Lesen, zu verstehen, was async und await sind für. Hier sind einige Artikel: Der lange Weg zu Async/Await in JavaScript und Vereinfachung der Asynchronen Programmierung mit ES7 Async Functions und die Zähmung der asynchronen Tier mit ES7.
Du musst angemeldet sein, um einen Kommentar abzugeben.
async/await
bietet einfach eine synchrone fühlen, um asynchronen code. Es ist eine sehr elegante form der syntaktischen Zucker.Für einfache Abfragen und Datenmanipulation, Versprechen kann einfach sein, aber wenn Sie in Szenarien, in denen komplexe Daten-manipulation-und so weiter beteiligt sind, ist es einfacher zu verstehen, was Los ist, wenn der code einfach sieht, als ob es synchron (anders ausgedrückt, der syntax an und für sich eine form des "neben-Komplexität", die
async/await
umgehen können).Wenn Sie daran interessiert zu wissen, Sie können benutzen Sie eine Bibliothek wie
ko
(neben-Generatoren) zu geben, die die gleiche Art von Gefühl. Dinge wie diese wurden entwickelt, um das problem zu lösen, dassasync/await
letztlich löst (nativ).Async/Await bieten eine viel schönere syntax in komplexen Szenarien. Insbesondere alles, was den Umgang mit loops oder bestimmte andere Konstrukte wie
try
/catch
.Beispiel:
In diesem Beispiel würde deutlich mehr gewunden, die nur mit Versprechungen.
const getValue = value => value || operation1().then(operation2).then(getValue);
Der ersten Dinge, die Sie haben zu verstehen, dass
async
/await
syntax ist nur syntaktischer Zucker, die gemeint ist, zu vermehren verspricht. In der Tat ist der Rückgabewert einerasync
Funktion ist ein Versprechen.async
/await
syntax gibt uns die Möglichkeit, das schreiben asynchron synchron. Hier ist ein Beispiel:Versprechen Verkettung:
Async
Funktion:In dem obigen Beispiel die
await
wartet auf die Verheißung (fetch(url)
) werden entweder aufgelöst oder abgelehnt. Ob das Versprechen gelöst ist-Wert gespeichert wird, in derresponse
variable, wenn das Versprechen wird abgelehnt, es würde einen Fehler auslösen und damit in dencatch
block.Können wir bereits sehen, dass die Verwendung
async
/await
könnte besser lesbar als Versprechen Verkettung. Dies gilt insbesondere, wenn die Menge der Versprechungen, die wir verwenden, erhöht. Beide Versprechen Verkettung undasync
/await
lösen das problem der callback-Hölle und welche Methode Sie wählen, ist eine Frage der persönlichen Vorliebe.Vollständigen Vergleich mit pros und cons.
Plain JavaScript
Async (Bibliothek)
Verspricht
Generatoren
Async-await
Async/await die dabei helfen können, Ihren code sauberer und besser lesbar in Fällen, wo Sie brauchen, komplizierte Steuerung-flow. Es produziert auch mehr debug-freundlichen code. Und macht es möglich zu behandeln, sowohl synchrone und asynchrone Fehler mit nur
try/catch
.Vor kurzem habe ich diesen post schrieb, zeigt die Vorteile des async/await-über Verheißungen in einige gängige Anwendungsfälle mit Beispielen https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9
beide sind die Möglichkeiten zum Umgang mit async-code. Aber es gibt einen Unterschied zwischen der Ausführung der einzelnen. Hier ist der Arbeits-Ausführung -
Versprechen
Den Promise-Objekt repräsentiert die möglichen Abschluss (oder Misserfolg) eines asynchronen Vorgangs und der daraus resultierende Wert. Es ist ein proxy für den Wert nicht unbedingt bekannt an seiner Schöpfung Zeit, und es repräsentiert die Zukunft, die das Ergebnis einer asynchronen operation.
Der aufrufende code kann warten, bis das Versprechen erfüllt ist, vor dem ausführen der nächsten Schritt. So zu tun, das Versprechen hat eine Methode namens
then
, die akzeptiert, dass eine Funktion, die aufgerufen wird, wenn das Versprechen wurde erfüllt.Async/await
Wenn ein
async
Funktion wird aufgerufen, es gibt einePromise
. Wenn dieasync
- Funktion gibt einen Wert zurück, derPromise
wird gelöst mit den zurückgegebenen Wert. Wenn dieasync
Funktion löst eine exception oder einen anderen Wert, das Versprechen wird abgelehnt mit dem Wert geworfen.Eine async-Funktion enthalten, kann ein await-Ausdruck, der hält die Ausführung der async-Funktion und wartet auf den übergebenen Versprechen, die Auflösung, und dann wieder die asynchrone Funktion, die Ausführung und gibt die aufgelösten Wert
Fortsetzung Semantik asynchroner Operationen.