await 与 then - 访问返回值

问题描述 投票:0回答:4

尝试了解 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...
        } );
    }  ...
asynchronous async-await promise
4个回答
1
投票

有没有办法将 .then 与异步函数一起使用,这样 可以在函数执行的下游访问结果吗?

不。没有可靠的方法可以做到这一点。

此外,您一开始就不需要这样做。一旦数据可用,无论您想在承诺链之后对数据做什么,都可以在回调函数内完成。

使用await(带有异步函数)返回一个可以使用的var 下游

是的,但这只是可能的,因为
async-await

在承诺链中是如何转换的。该

“下游”
代码实际上包装在 then() 方法的回调函数中。
    


0
投票
then

块内的承诺移动代码并继续那里。

baz (10)
        .then ( (result) =>{
            z = result;
            console.log('baz returned: '+ z); // undefined...executes before .then completes...
        });



0
投票
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)})



0
投票

从这里可以学到更多。

https://masudsaiful.github.io/javascript-async-await-step-by-step-tutorial

© www.soinside.com 2019 - 2024. All rights reserved.