首页 文章

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

提问于
浏览
5

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

例如,为什么这个mongoose语句需要它返回一个promise的函数?

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

我看到运行时/转换器解析了团队对它的 Value 的承诺和异步信号,它“抛出”被拒绝的承诺 .

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

2 回答

  • 0

    我'm not privy to the JavaScript language design discussions, but I assume it' s的原因与the C# language requires async(另见my blog)相同 .

    即:

    • 向后兼容性 . 如果 await 突然在任何地方突然出现了新关键字,那么使用 await 作为变量名的任何现有代码都会中断 . 由于 await 是一个上下文关键字(由 async 激活),因此只有打算使用 await 作为关键字的代码才能使 await 成为关键字 .

    • 更易于解析 . async 使异步代码更容易解析为转换器,浏览器,工具和人类 .

  • 3

    由@phaux复制https://stackoverflow.com/a/41744179/1483977

    这些答案都给出了为什么async关键字是好事的有效论据,但它们都没有提到它必须添加到规范的真正原因 . 原因是这是一个有效的JS pre-ES7函数await(x){
    返回'等待'x
    }

    function foo(){
    返回(AWAIT(42))
    }
    根据你的逻辑,foo()会返回Promise {42}还是“等待42”? (返回Promise会破坏向后兼容性)所以答案是:await是一个常规标识符,它只被视为异步函数中的关键字,因此必须以某种方式标记它们 . 有趣的事实:原始规范为异步语法提出了更轻量级的函数^ foo(){} .

相关问题