为什么javascript函数需要关键字“quot;”;异步;?Isn';";等待“;关键字够了吗?
例如,为什么下面的函数需要有“async”。。使用await是否足够具体,编译器是否可以在不产生歧义的情况下解析代码为什么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关键字? 感谢从语言
# 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的结果。在一个更大的函数中,它可能更有意义。你可能会发现这个博客很有用:我同意这可能是一个解析问题。博客中写道:“当一个函数被声明为异步时,它就能够在等待承诺得到解决的同时让调用代码执行。”我猜原因归结为“因为规范这么说”,或者至少在有规范的情况下可能会这样做,这是其他实现异步/等待的语言中常用的模式,为了确定,您必须与您提出此功能的人交谈。这并不适合堆栈溢出,即使它本身就是一个有趣的问题。