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
使异步代码更容易为传输程序、浏览器、工具和人员解析function await(x) {
return 'awaiting ' + x
}
function foo() {
return(await(42))
}
根据您的逻辑,foo()
returnPromise{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
的有效方法。