例如,为什么下面的函数需要“异步”?使用await是否足够具体,编译器无法毫无歧义地解析代码?
// Why do we need async here?
async function foo() {
var user = await getUser(user_id);
console.log(user);
}
是出于向后兼容性的原因吗?(我想不出在标准 JavaScript中使用await键盘的任何代码......)?
主要是为了清楚说明这个函数使用了新的async关键字吗?
例如,为什么下面的函数需要“异步”?使用await是否足够具体,编译器无法毫无歧义地解析代码?
// Why do we need async here?
async function foo() {
var user = await getUser(user_id);
console.log(user);
}
是出于向后兼容性的原因吗?(我想不出在标准 JavaScript中使用await键盘的任何代码......)?
主要是为了清楚说明这个函数使用了新的async关键字吗?
从语言的角度来看,JavaScript 中的async/关键字的设计非常接近于它们在 C# 中的工作方式。await
我有一篇旧博客文章描述了一些关于为什么async在 C# 中显式添加的讨论:请参阅Inferring "async"此处。简而言之,添加关键字是对语言的潜在破坏性更改。想象一个现有的应用程序使用某种var await = false;或某种性质的东西。
或者,例如,这可能会更加模棱两可,var await = function() {};将用作await (x);。查看用法await (x);,编译器将很难确定这是哪种表达式。您可能会争辩说这await是一个关键字,除非在范围内有一个具有该名称的变量,但这真的很麻烦。
一个更简洁的解决方案是引入一对关键字,因此async(仅用于函数和 lambda,并且没有歧义)启用await关键字,但仅在该范围内。具有表示生成器也有类似的好处function*,而不仅仅是存在yield.
它不仅不那么模棱两可(保持与用于其他事物的代码的向后兼容性),而且对于软件和await人类来说也更容易解析。