2016-02-26 57 views
5

例如,为什么下面的函数需要“async”..没有使用足够的编译器来解析代码而没有歧义?为什么JavaScript函数需要关键字“异步”? “await”关键字不够吗?

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

它是出于向下兼容性的原因吗? (我想不出任何使用标准Javascript中的await键盘的代码..)?

主要是为了清楚起见,说清楚这个函数使用了新的async关键字吗? 感谢

+1

我只能想象它使解析更容易.... –

+1

在这个例子中,它没有多大意义。你正在异步运行一些东西,然后告诉它等待getUser的结果。在更大的功能范围内它可能更有意义。 – Neil

+0

您可能会发现这个博客很有用:https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html我同意这可能是一个解析问题。在博客中:“当一个函数被声明为async时,它就能够执行到调用代码,而它正在等待一个承诺被解决。” – scrappedcola

回答

6

从语言的角度来看,async/await关键字在JavaScript设计非常密切合作,他们在C#中的工作方式。

我有一篇旧的博客文章,描述了为什么async明确添加到C#中:see Inferring "async" here。简而言之,添加关键字是语言潜在的重大改变;想象一个使用var await = false;或者其他类型的应用程序。

或者,对于这可能更模糊的示例,var await = function() {};,其将被用作await (x);。看看await (x);的使用情况,编译器将很难决定哪种表达方式。你可能会认为await是一个关键字,除非这个名称的范围内有一个变量,但会变得非常多毛。

更清洁的解决方案是引入关键字,所以async(其只用于功能和lambda表达式,并且是没有歧义)使await关键字,但只在该范围内。有function*表示发电机,而不仅仅是存在yield有类似的好处。

这不仅更加明确(维护与使用await其他的东西代码向后兼容),但它也是两个软件人类解析更容易。

相关问题