提问者:小点点

JS async/await-为什么await需要异步?


为什么使用需要将其外部函数声明为

例如,为什么mongoose语句需要它所在的函数来返回承诺?

async function middleware(hostname, done) {
  try {
    let team = await Teams.findOne({ hostnames: hostname.toLowerCase() }).exec();
    done(null, team);
  } catch (err) { done(err); }
}

我看到Runtime/Transpiler将团队的承诺解析为它的值,并用异步信号通知它“抛出”被拒绝的承诺。

但是try/catch“捕获”那些被拒绝的承诺,那么为什么异步和等待如此紧密地耦合呢?


共2个答案

匿名用户

我不了解JavaScript语言设计的讨论,但我认为这是出于与C#语言需要相同的原因(也请参阅我的博客)。

即:

    突然成为一个到处都是的新关键字,那么任何使用作为变量名的现有代码都将中断。由于是上下文关键字(由激活),因此只有打算使用作为关键字的代码才会将作为关键字。/li> 使异步代码更容易为transpiler,浏览器,工具和人员解析。/li>

匿名用户

抄自https://stackoverflow.com/A/41744179/1483977,电子邮件:@phaux:

这些答案都给出了async关键字为什么是一个好东西的有效论据,但没有一个真正提到必须将其添加到规范中的真正原因。

原因是这是一个有效的JS pre-ES7

function await(x) {
  return 'awaiting ' + x
}

function foo() {
  return(await(42))
}

根据您的逻辑,会返回还是?(返回承诺会破坏向后兼容性)

所以答案是:是一个常规标识符,它只作为异步函数中的关键字处理,因此必须以某种方式对它们进行标记。

有趣的事实:最初的规范为异步语法提出了更轻量级的

相关问题