为什么javascript函数需要关键字“quot;”;异步;?Isn';";等待“;关键字够了吗?

为什么javascript函数需要关键字“quot;”;异步;?Isn';";等待“;关键字够了吗?,javascript,async-await,ecmascript-next,Javascript,Async Await,Ecmascript Next,例如,为什么下面的函数需要有“async”。。使用await是否足够具体,编译器是否可以在不产生歧义的情况下解析代码 # Why do we need async here async function foo() { var user = await getUser(user_id); console.log(user); } 是因为向后兼容的原因吗?(我想不出任何代码在标准Javascript中使用等待键盘…) 是否主要是为了清楚地说明此函数使用了新的async关键字? 感谢从语言

例如,为什么下面的函数需要有“async”。。使用await是否足够具体,编译器是否可以在不产生歧义的情况下解析代码

# Why do we need async here
async function foo() {
  var user = await getUser(user_id);
  console.log(user);
}
是因为向后兼容的原因吗?(我想不出任何代码在标准Javascript中使用等待键盘…)

是否主要是为了清楚地说明此函数使用了新的async关键字?
感谢

从语言的角度来看,JavaScript中的
异步
/
等待
关键字的设计非常接近于它们在C#中的工作方式

我有一篇老博文,其中描述了一些关于为什么在C#:中明确添加了
async
的讨论。简言之,添加关键字可能会对语言造成破坏性的改变;设想一个现有的应用程序使用
var await=false或类似的东西

或者,举一个例子,说明这可能更加模糊,
var await=function(){},将用作
等待(x)。查看用法
wait(x),编译器将很难决定这是什么类型的表达式。你可以争辩说,
await
是一个关键字,除非作用域中有一个使用该名称的变量,但这会让人感到毛骨悚然

一个更简洁的解决方案是引入一对关键字,因此
async
(仅用于函数和lambda,且不含糊)启用
wait
关键字,但仅在该范围内。拥有
函数*
表示生成器,而不仅仅是存在
产量
,也有类似的好处


它不仅不那么模棱两可(保持与使用
await
进行其他操作的代码的向后兼容性),而且对软件和人来说都更容易解析。

我只能想象它使解析更容易……在这个例子中,它没有多大意义。您正在异步运行一些东西,然后告诉它等待getUser的结果。在一个更大的函数中,它可能更有意义。你可能会发现这个博客很有用:我同意这可能是一个解析问题。博客中写道:“当一个函数被声明为异步时,它就能够在等待承诺得到解决的同时让调用代码执行。”我猜原因归结为“因为规范这么说”,或者至少在有规范的情况下可能会这样做,这是其他实现异步/等待的语言中常用的模式,为了确定,您必须与您提出此功能的人交谈。这并不适合堆栈溢出,即使它本身就是一个有趣的问题。