为什么使用 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 回答
我'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
使异步代码更容易解析为转换器,浏览器,工具和人类 .由@phaux复制https://stackoverflow.com/a/41744179/1483977:
function foo(){
返回(AWAIT(42))
}
根据你的逻辑,foo()会返回Promise {42}还是“等待42”? (返回Promise会破坏向后兼容性)所以答案是:await是一个常规标识符,它只被视为异步函数中的关键字,因此必须以某种方式标记它们 . 有趣的事实:原始规范为异步语法提出了更轻量级的函数^ foo(){} .