尝试了解 wait 与 then 之间的细微(原文如此)差异。我已经阅读了这里的大部分帖子,所以我知道异步函数返回一个承诺。
使用await(带有异步函数)返回一个可以在下游使用的var,但是使用.then(带有异步函数)不会(至少对我来说)同样返回一个可以在then子句之外访问的var),因为它是异步处理的,下游引用是同步处理的 - 在 .then 子句之外,var(在我的示例中)是未定义的。
我理解为什么我的示例的行为方式如此,但我的问题是 - 有没有办法将 .then 与异步函数一起使用,以便可以在函数执行的下游访问结果?
let x, y, z;
async function foo ( num ) {
return Promise.resolve ( num + 10 );
}
async function bar (num) {
return num + 20;
}
async function baz (num) {
return Promise.resolve ( num + 30 );
}
async function main (){
x = await foo(10);
console.log('foo returned (after await): '+ x); // no hay problema!
y = await bar (10);
console.log('bar returned (after await): '+ y); // no hay problema!
baz (10)
.then ( (result) =>{
z = result;
});
console.log('baz returned: '+ z); // undefined...executes before .then completes...
}
main();
更新
我想我在一组链接的 then 子句之外使用 x 和 y 的目标存在一些问题。这是我正在尝试做的一个(希望更多)现实世界的例子:
在下面的代码中,schemaValidation 可以在 Express 应用程序内的任何路由中使用(所述路由在 initAppRouter 中初始化):
// main
const schemaDB = await initAppDBSchema ();
const schemaValidation = await initAppDataValidationSchema();
const Author = mongoose.model ( 'Author', schemaDB );
let author: any;
let authors: any;
await initAppDB ();
await initAppRouter ();
async function initAppDataValidationSchema () {
return joi.object ( {
authorName: joi.string ()
.min ( 3 )
.max ( 30 )
.required (),
etc...
} );
} ...
有没有办法将 .then 与异步函数一起使用,这样 可以在函数执行的下游访问结果吗?
不。没有可靠的方法可以做到这一点。
此外,您一开始就不需要这样做。一旦数据可用,无论您想在承诺链之后对数据做什么,都可以在回调函数内完成。
使用await(带有异步函数)返回一个可以使用的var 下游是的,但这只是可能的,因为
async-await
在承诺链中是如何转换的。该
“下游”代码实际上包装在
then()
方法的回调函数中。then
块内的承诺移动代码并继续那里。
baz (10)
.then ( (result) =>{
z = result;
console.log('baz returned: '+ z); // undefined...executes before .then completes...
});
await
解决,以便代码将以非异步方式运行,或者使用
then
进行链式回调
await baz (10)
.then ( (result) =>{
z = result;
});
console.log('baz returned: '+ z)
所以一切都完成了,或者
baz (10)
.then ( (result) =>{z = result;})
.then ( () =>{console.log('baz returned: '+ z)})