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

新手上路,请多包涵

我正在尝试学习异步等待。在这段代码中 -

 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());

为什么我得到的输出是 -

 Promise { <pending> }

而不是一些价值? getResult() 函数不应该等待 myFun() 函数解析它的承诺值吗?

原文由 hg_git 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 477
2 个回答

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

您的最终通话需要是:

 getResult().then(response => console.log(response));

或者类似的东西:

 (async () => console.log(await getResult()))()

原文由 Ben Fortune 发布,翻译遵循 CC BY-SA 3.0 许可协议

您需要了解的是,async/await 不会使您的代码同步运行,但让我们将其编写为:

简而言之:前面有 async 的函数实际上是异步执行的,因此关键字“async”。而“await”关键字将使在此异步函数中使用它的那一行代码在其执行期间等待承诺。所以尽管线路等待,整个函数仍然异步运行,除非该函数的调用者也“等待”……

更详细地解释:当你将 async 放在函数前面时,实际上所做的是让它返回一个承诺,无论该函数在其中返回什么。该函数异步运行,当执行 return 语句时,promise 解析返回值。

意思是,在你的代码中:

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

函数“getResult()”将返回一个 Promise,该 Promise 将在完成执行后解析。因此 getResult() 函数内的行是异步运行的,除非您告诉调用 getResult() 的函数也“等待”它。在 getResult() 函数中,你可能会说它必须等待结果,这使得 getResult() 的执行等待它解决承诺,但 getResult() 的调用者不会等待,除非你也告诉调用者“等待” ‘.

所以一个解决方案是调用:

 getResult().then(result=>{console.log(result)})

或者在另一个函数中使用时,您可以再次使用“等待”

 async function callingFunction(){
    console.log(await(getResult());
}

原文由 Pim_nr_47 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏