异步功能 - 等待不等待承诺

hg_*_*git 20 javascript asynchronous node.js ecmascript-2017

我正在努力学习async-await.在这段代码中 -

const myFun = () => {
    let state = false;

    setTimeout(() => {state = true}, 2000);

    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if(state) {
                resolve('State is true');
            } else {
                reject('State is false');
            }
        }, 3000);
    });
}

const getResult = async () => {
    return await myFun();
}

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

为什么我得到输出 -

Promise { <pending> }
Run Code Online (Sandbox Code Playgroud)

而不是一些价值?getResult()功能等待myFun()功能不应该解决它的承诺值吗?

Ben*_*une 19

如果您使用的是async/await,则所有调用都必须使用Promises或async/await.你不能只是神奇地从同步调用中获得异步结果.

你的最后一次电话需要是:

getResult().then(response => console.log(response));
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

(async () => console.log(await getResult()))()
Run Code Online (Sandbox Code Playgroud)

  • @hg_git:`async`函数返回promises.`await`"神奇地"在执行下面的代码之前解开一个promise.代码*看起来*同步,但它不是同步执行的. (4认同)
  • 为什么 last async (带有 IIFE 的那个)变成同步而不是我的 `getResult()` 方法? (2认同)
  • 我的`getResult()` 也有`async` 关键字,还有一个`await` 调用。 (2认同)

小智 5

您需要了解的是async / await不会使您的代码同步运行,但让您像这样编写它:

简而言之:前面带有async的函数实际上是异步执行的,因此关键字为“ async”。而“ await”关键字将使在此异步函数中使用它的行在执行过程中等待promise。因此,尽管该行正在等待,但整个函数仍将异步运行,除非该函数的调用者也“唤醒”了...

更详细地解释:当您将async放在函数前面时,实际上所做的是使它以函数内部返回的内容返回promise。该函数异步运行,当执行return语句时,promise解析返回值。

含义,在您的代码中:

const getResult = async () => {
    return await myFun();
}
Run Code Online (Sandbox Code Playgroud)

函数“ getResult()”将返回一个Promise,该Promise将在执行完成后解决。因此,除非您告诉调用getResult()的函数也要对其“等待”,否则getResult()函数内的各行将异步运行。在getResult()函数内部,您可能会说它必须等待结果,这会使getResult()的执行等待其解决承诺,但是getResult()的调用者不会等待,除非您还告诉调用者'await '。

因此,解决方案将调用以下任一方法:

getResult().then(result=>{console.log(result)})
Run Code Online (Sandbox Code Playgroud)

或者在其他功能中使用时,只需再次使用“等待”

async callingFunction(){
    console.log(await(getResult());
}
Run Code Online (Sandbox Code Playgroud)