2016-02-26 9 views
5

Zum Beispiel, warum muss die Funktion unten "async" haben .. ist nicht verwenden warten spezifisch genug für den Compiler, um den Code ohne Mehrdeutigkeit zu analysieren?Warum müssen JavaScript-Funktionen das Schlüsselwort "async" haben? Ist das "Warten" -Schlüsselwort nicht genug?

# Why do we need async here 
async function foo() { 
    var user = await getUser(user_id); 
    console.log(user); 
} 

Ist es aus Gründen der Rückwärtskompatibilität? (Ich kann mir keinen Code vorstellen, der die Standardtastatur in Standard-Javascript verwendet).

Gibt es hauptsächlich Klarheit, um zu verdeutlichen, dass diese Funktion das neue async-Schlüsselwort verwendet? Dank

+1

Ich kann mir nur vorstellen, dass es Parsing einfacher macht .... –

+1

In diesem Beispiel würde es nicht viel Sinn machen. Sie führen etwas asynchron aus und sagen dann, dass Sie auf Ergebnisse von getUser warten sollen. Es könnte im Zusammenhang mit einer größeren Funktion sinnvoller sein. – Neil

+0

Sie könnten diesen Blog nützlich finden: https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html Ich stimme zu, es ist wahrscheinlich ein Parsing-Problem. Aus dem Blog: "Wenn eine Funktion als async deklariert wird, ist sie in der Lage, dem aufrufenden Code eine Ausführung zu geben, während sie darauf wartet, dass ein Versprechen gelöst wird." – scrappedcola

Antwort

6

Aus Sprache Sicht ist die async/await Schlüsselwörter in JavaScript ist sehr eng mit der Art und Weise entwirft sie in C# arbeiten.

Ich habe einen alten Blog-Beitrag, der einige Diskussionen rund um beschreibt, warum async explizit in C# hinzugefügt wurde: see Inferring "async" here. Kurz gesagt, das Hinzufügen von Schlüsselwörtern ist eine potenziell bahnbrechende Änderung einer Sprache. Stellen Sie sich eine vorhandene App vor, die eine var await = false; oder etwas von dieser Art verwendet.

Oder für ein Beispiel, wie dies mehrdeutig sein könnte, var await = function() {};, die als await (x); verwendet werden würde. Betrachtet man die Verwendung await (x);, würde es dem Compiler schwer fallen zu entscheiden, welche Art von Ausdruck das ist. Sie könnten argumentieren, dass await ein Schlüsselwort ist, es sei denn gibt es eine Variable im Bereich mit diesem Namen, aber das wird wirklich haarig.

A viel sauberer Lösung ist, ein Paar von Schlüsselwörtern einzuführen, so async (die nur für Zwecke verwendet und Lambdas und ist nicht mehrdeutig) ermöglicht die await Schlüsselwort, aber nur innerhalb dieses Bereichs. Es gibt ähnliche Vorteile, function* bezeichnen Generatoren, anstatt nur das Vorhandensein von yield.

Es ist nicht nur weniger zweideutig (Aufrechterhaltung der Abwärtskompatibilität mit Code, die await für andere Dinge verwendet), aber es ist auch einfacher, sowohl für Software und Menschen zu analysieren.

Verwandte Themen