2016-06-11 3 views
0

Es scheint, als ob ein Compiler/Parser intelligent genug sein sollte, um zu erkennen, ob eine Funktion await verwendet, dann wird sie automatisch zu einer async Funktion.Warum zwingt mich Javascript (ES.next), eine Funktion als async zu deklarieren, wenn ich sie verwenden möchte?

Warum muss ich das Schlüsselwort async eingeben? Es fügt Unordnung hinzu und es gibt viele Male, wo ich vergesse, es hinzuzufügen, und ich bekomme einen Fehler und dann muss ich gehen und es hinzufügen.

Wäre es von Nachteil, wenn der Compiler die Funktion automatisch auf async hochfährt, wenn er await sieht und nur jedem die Mühe erspart, damit umzugehen?

+0

Die Tatsache, dass Sie manchmal vergessen, es hinzuzufügen, sollte Grund genug sein. Wenn du den Code schreibst und vergisst, ihn hinzuzufügen, welche Hoffnung hast du, herauszufinden, was hier vor sich geht? – rockerest

+0

Danke. Ich habe ES7 im Titel hinzugefügt, um genauer zu sein. Obwohl es keine Anforderung von Javascript selbst ist, denke ich, dass so ziemlich jede größere Javascript-Implementierung zu ursprünglichem Code kompiliert. Zumindest für den Abschnitt, die heiß sind. –

+0

Ohne explizite Definition einer asynchronen Funktion, wie kann ein Leser herausfinden, dass es asynchron ist? Sie erwarten nicht, dass ein Leser den gesamten Text der Funktion liest, um ein "Warten" zu finden, um sicherzustellen, dass es asynchron ist oder nicht. –

Antwort

1

Vergleich Asynchron-Funktionen ES6 Generator-Funktionen und es ist ziemlich offensichtlich:

function* x() {} // Generator function without 'yield' 
Object.getPrototypeOf(x); // returns GeneratorFunction 

Generator Funktionen von traditionellen Funktionen von Natur aus unterschiedlich sind, aber sie brauchen keine yield Ausdruck in ihrem Körper zu haben. Es gab tatsächlich a bug in the ES6 proposal, die erklärt, dass es ein Syntaxfehler ist, wenn die Generatorfunktion keine yield enthalten, aber es wurde schnell behoben:

Ein wichtiger Anwendungsfall ist mit einem Dummy-Generator Prototyping. Oder der Fall, in dem Sie eine Ausbeute zum Debuggen kommentieren. Das sollte nicht das Programm ungültig machen.

Das gleiche gilt für Asynchron-Funktionen: Nach the draft, eine Asynchron-Funktion nicht, während nach wie vor von einer traditionellen Funktion verhielt anders erforderlich ist ein awaits in seinem Körper zu haben.

Nehmen wir an, Sie kommentieren eine await aus. Sollte der Interpreter dann Ihre Async-Funktion als traditionelle Funktion parsen und möglicherweise Ihren gesamten Code aufbrechen? Besser nicht.

Verwandte Themen