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

Javascript JS async/await-为什么await需要异步?,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,为什么使用await需要声明其外部函数async 例如,为什么这个mongoose语句需要它所在的函数来返回承诺 async function middleware(hostname, done) { try { let team = await Teams.findOne({ hostnames: hostname.toLowerCase() }).exec(); done(null, team); } catch (err) { done(err); } } 我看到

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

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

async function middleware(hostname, done) {
  try {
    let team = await Teams.findOne({ hostnames: hostname.toLowerCase() }).exec();
    done(null, team);
  } catch (err) { done(err); }
}
我看到运行时/transpiler解析团队对其价值的承诺,并发出异步信号“抛出”拒绝的承诺


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

我不知道JavaScript语言设计的讨论,但我认为这是出于同样的原因(另请参阅)

即:

  • 向后兼容性。如果
    await
    突然成为一个新的关键字,那么任何使用
    await
    作为变量名的现有代码都将中断。由于
    await
    是上下文关键字(由
    async
    激活),因此只有打算将
    await
    用作关键字的代码才会将
    await
    作为关键字
  • 更容易解析
    async
    使异步代码更容易为传输程序、浏览器、工具和人员解析
  • 抄自@phaux:

    这些答案都为async关键字为什么是 这是件好事,但他们都没有提到真正的原因 已将添加到规范中

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

    function await(x) {
      return 'awaiting ' + x
    }
    
    function foo() {
      return(await(42))
    }
    
    根据您的逻辑,
    foo()
    return
    Promise{42}
    “等待42”
    ?(兑现诺言会使你背弃诺言 兼容性)

    所以答案是:
    await
    是一个常规标识符,它只是 在异步函数中被视为关键字,因此必须对其进行标记 在某种程度上

    有趣的事实:最初的规范提出了更轻量级的
    函数^foo()
    {}
    用于异步语法


    因为在
    中间件
    函数中使用
    wait
    意味着
    中间件
    函数不能立即返回结果(它必须等待
    wait
    解决),而
    中间件
    函数调用方必须等待承诺(从
    中间件
    函数返回)解决了。

    我不明白你所说的“但是尝试/抓住”抓住了“那些被拒绝的承诺”。这与
    async
    关键字有什么关系?是否可能重复?“为什么此mongoose语句需要它所包含的函数来返回承诺?”-否则它将如何等待mongoose承诺的异步结果?以下是语言设计的原因:
    wait
    的使用不需要空格吗?我的意思是,如果await只是一个变量,那么类似于
    var a=await foo()的代码是否有效?为什么foo()会返回'waiting 42'?从结构上看,这是显而易见的。我猜return await(somePromise)是指在返回决议之前,等待某个承诺得到解决。或者至少这看起来是一个有用的速记。但实际上,这种延迟返回基本上是一种承诺。好的,明白了。@user4052054是的,但是
    await(expressionthateevaluatestoapromise)
    是等待承诺的有效语法构造,而
    await(5)
    是将参数
    5
    传递给用户定义函数
    await
    的有效方法。