异步函数在等待完成之前返回

Gal*_*puf 8 javascript async-await

我有以下示例中的两个问题:

为什么 x 在 y 之前记录?为什么是xa Promise?

我期待在它记录之前bar等待foo解决该值'Hello'然后返回它。

let foo = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Hello');
        }, 2000);
    })
}

let bar = async () => {
    let y = await foo();
    console.log(y);
    return y;
}

let x = bar();

console.log(x);
Run Code Online (Sandbox Code Playgroud)

我期待看到的是

'Hello' // console.log(y)
'Hello' // console.log(x)
Run Code Online (Sandbox Code Playgroud)

我得到的是

 Promise {<pending>}  // console.log(x)
 'Hello'              // console.log(y)
Run Code Online (Sandbox Code Playgroud)

不应该barfoo解决后再返回y吗?

任何帮助将非常感激!

Fra*_*ica 7

您需要await该功能:

let example = async () => {
    let foo = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('Hello');
            }, 2000);
        })
    }

    let bar = async () => {
        let y = await foo();
        console.log(y);
        return y;
    }

    let x = await bar();

    console.log(x);
}

example();
Run Code Online (Sandbox Code Playgroud)

  • 这将给出“await 仅在异步函数中有效”的错误 (2认同)

R.D*_*eil 6

这里是关于文档async functionhttps : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

Promise对象:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

据说 anasync function返回一个Promise对象,该对象在pending解析之前处于某种状态。


现在让我们看看你的代码:

您分配给x的返回值bar()a Promise,因为没有await停止执行的关键字(并且您不能添加一个,因为您在 a 之外async function)此承诺被记录为挂起,因为async function bar()尚未返回。

同时,在async function bar()你分配给y的返回值async function foo()也是 a Promise,但这次你让它等待结果。经过 2 秒的等待时间后,promise 实现并y记录了该resolve()方法的参数,即Hello.

因此,您目睹的行为是预期的行为。