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