为什么javascript函数需要关键字“async”? “await”关键字不够用吗?

时间:2016-02-26 16:05:16

标签: javascript async-await ecmascript-next

例如,为什么下面的函数需要“async”..是不是使用等待特定的足够的编译器来解析代码而没有歧义?

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

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

主要是为了清楚明白这个函数是否使用了新的async关键字? 感谢

1 个答案:

答案 0 :(得分:6)

从语言角度来看,JavaScript中的async / await个关键字与中的非常密切相关。

我有一篇旧帖子,其中介绍了为什么在{C#:see Inferring "async" here中明确添加了async的一些讨论。简而言之,添加关键字是对语言的潜在重大变化;想象一下使用var await = false;或类似性质的现有应用程序。

或者,有关如何更加含糊不清的示例var await = function() {};,它将用作await (x);。查看用法await (x);,编译器很难决定使用哪种表达式。您可以说await是一个关键字,除非在该范围内有一个带有该名称的变量,但这真的很毛茸茸。

更清晰的解决方案是引入关键字,因此async(仅用于函数和lambda,并且不含糊)启用await关键字,但仅限于该范围内。让function*表示生成器有类似的好处,而不仅仅是yield的存在。

它不仅不那么模糊(保持与其他东西使用await的代码的向后兼容性),但对于软件的人来说也更容易解析。