6

例如,为什么下面的函数需要“异步”?使用await是否足够具体,编译器无法毫无歧义地解析代码?

// Why do we need async here?
async function foo() {
  var user = await getUser(user_id);
  console.log(user);
}

是出于向后兼容性的原因吗?(我想不出在标准 JavaScript中使用await键盘的任何代码......)?

主要是为了清楚说明这个函数使用了新的async关键字吗?

4

1 回答 1

8

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

我有一篇旧博客文章描述了一些关于为什么async在 C# 中显式添加的讨论:请参阅Inferring "async"此处。简而言之,添加关键字是对语言的潜在破坏性更改。想象一个现有的应用程序使用某种var await = false;或某种性质的东西。

或者,例如,这可能会更加模棱两可,var await = function() {};将用作await (x);。查看用法await (x);,编译器将很难确定这是哪种表达式。您可能会争辩说这await是一个关键字,除非在范围内有一个具有该名称的变量,但这真的很麻烦。

一个更简洁的解决方案是引入一关键字,因此async(仅用于函数和 lambda,并且没有歧义)启用await关键字,但仅在该范围内。具有表示生成器也有类似的好处function*,而不仅仅是存在yield.

它不仅不那么模棱两可(保持与用于其他事物的代码的向后兼容性),而且对于软件await人类来说也更容易解析。

于 2016-02-26T17:15:29.420 回答