2016-02-26 5 views
5

たとえば、以下の関数で "async"が必要なのはなぜですか?コンパイラがあいまいさなくコードを解析するのに十分なだけのwaitを使用していませんか?javascript関数でキーワード "async"が必要なのはなぜですか? "await"キーワードは十分ではありませんか?

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

下位互換性の理由からですか? (私は、標準のJavascriptで待っているキーボードを使用するコードを考えることはできません..)?

この関数が新しいasyncキーワードを使用していることを明確にするためですか?言語の観点から おかげ

+1

私はそれが解析を容易にすると想像することができます.... –

+1

この例では、あまり意味がありません。非同期に何かを実行していて、getUserからの結果を待つように指示しています。それは、より大きな機能の文脈においてより意味をなさされるかもしれない。 – Neil

+0

あなたはこのブログが役立つかもしれません:https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html私はそれがおそらく解析の問題であることに同意します。ブログから:「関数が非同期として宣言されると、呼び出し元のコードに実行を返すことができますが、約束が解決されるのを待っています。」 – scrappedcola

答えて

6

は、JavaScriptでasync/awaitキーワードは、彼らがC#での作業方法に密接に非常にを設計されています。

私は、asyncがC#:see Inferring "async" hereに明示的に追加された理由についてのいくつかの議論を説明する古いブログ記事を持っています。要するに、キーワードを追加することは、言語にとって潜在的に壊れやすい変更です。 var await = false;などを使用している既存のアプリを想像してみてください。

また、これがどのように曖昧になるかの例として、var await = function() {};await (x);として使用されます。使用法await (x);を見ると、コンパイラはどんな種類の式であるかを決定するのが難しいでしょう。 awaitはキーワードであると主張することができます。にはその名前のスコープ内に変数がありますが、それは本当に毛深くなります。

Aはるかクリーナー溶液(機能のみとラムダのために使用され、曖昧ではない)ので、asyncawaitキーワードを可能にのみその範囲内に、キーワードの一対を導入することです。 yieldの存在ではなく、function*がジェネレータを表すのと同様の利点があります。

awaitを使用するコードとの下位互換性を維持するだけでなく、ソフトウェアの両方の人間が解析する方が簡単です。

関連する問題