await vs then - 访问返回值

await vs then - accessing returned values

试图了解 await 与 then 之间的细微(原文如此)差异。我已经阅读了这里的大部分帖子,所以我得到了异步函数 return 的承诺。

使用 await(带有异步函数)returns 是一个可以在下游使用的 var,但是使用 .then(带有异步函数)同样不会(至少对我而言)return一个可以在 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(); 

更新

我想我 objective 在一组链式 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...
        } );
    }  ...

is there a way to use .then with an async function, such that the result can be accessed downstream of the function execution?

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

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

Using await (with an async function) returns a var that can be used downstream

是的,但这只有在承诺链中 async-await 的转换方式才有可能。 "downstream" 代码实际上包装在 then() 方法的回调函数中。

无法让 promise 像您希望的那样同步运行。唯一的方法是将依赖于 promise 的代码移动到 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)})