为什么 JavaScript 函数需要有关键字“async”?“等待”关键字还不够吗?

Why do JavaScript functions need to have the keyword "async"? Isn't the "await" keyword enough?

本文关键字:关键字 等待 不够 JavaScript 函数 为什么 async      更新时间:2023-09-26

例如,为什么下面的函数需要有"异步"?使用 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 进行其他事情的代码的向后兼容性),而且软件人类也更容易解析。