JavaScript函数为什么需要使用关键字“async”?难道“await”关键字不够用吗?

6
例如,为什么下面的函数需要使用 "async" 关键字?使用“await”关键字不是已经足够明确了吗?
// Why do we need async here?
async function foo() {
  var user = await getUser(user_id);
  console.log(user);
}

这是为了向后兼容吗?(我想不出任何标准JavaScript代码使用 await 关键字的情况...)

这主要是为了清晰明确,以表明此函数使用新的 async 关键字吗?


1
我只能想象它使解析更容易... - Felix Kling
1
在这个例子中,这样做没有太多意义。你正在异步运行某些内容,然后告诉它等待从getUser返回的结果。在更大的函数上下文中可能会更有意义。 - Neil
1
我猜原因归结为“因为规范这样说”,或者至少在有规范的情况下可能会这样,而这是其他实现异步/等待的语言中常用的模式。 - adeneo
3
事实上,为了确定,您必须与您提出此功能的人进行交谈。即使这是一个有趣的问题,但它并不适合在Stack Overflow上讨论。 - Felix Kling
显示剩余3条评论
1个回答

8
从语言角度来看,JavaScript中的async/await关键字与它们在C#中的工作方式非常相似。
我有一篇旧博客文章描述了一些关于为什么在C#中显式添加async的讨论: 在这里查看推断"async"。简而言之,添加关键字可能会破坏一个语言; 想象一下使用var await = false;或类似代码的现有应用程序。
或者,更具歧义性的例子是var await = function() {};,它将被用作await (x);。看着使用await (x);,编译器很难决定那是什么样的表达式。你可以认为await是一个关键字,除非在作用域内有同名的变量,但这会变得非常棘手。
一种更为简洁的解决方案是引入一个关键词对,因此 async (仅用于函数和 lambda,不会产生歧义)启用 await 关键字,但仅在该范围内。使用 function* 表示生成器也有类似的好处,而不仅仅是使用 yield 的存在。
这不仅不会产生歧义(保持与使用 await 进行其他操作的代码向后兼容),而且对软件和人类解析都更容易。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接