首页 > 解决方案 > 使用异步函数返回 Promise

问题描述

给定以下两种实现(在 ES6/NodeJS 中)

async TestFunc() {
    return new Promise((resolve,reject) => {
        ...
    });
}

TestFunc() {
    return new Promise((resolve,reject) => {
        ...
    });
}

如果我像这样调用这些函数中的任何一个,行为会有什么不同吗?

await TestFunc();

我假设第一个(异步)实现将返回一个 Promise,我们将等待它返回另一个 Promise,而后一个(同步)实现将返回该 Promise,然后它会被等待。但是,它们都按预期工作,让我有点困惑。

标签: javascriptnode.jses6-promise

解决方案


异步函数返回一个承诺,该承诺将由return在函数体中执行的语句返回的值解析(或undefined在执行最后一行函数代码后返回的 if 解析)。

用一个 Promise 解决一个 Promise 使得该已解决的 Promise 在它被解决时具有解决的 Promise 的已解决状态和值。

所以总是在第一次调用时从异步函数体同步返回一个 Promise P立即将调用 async 函数返回的 Promise 的结果链接到P的结果。对于同步返回的 Promise,这是一个不必要的步骤,并且async函数的声明不是必需的。

如果TestFunc是一个异步函数,对于

await TestFunc();

运算符的操作数是调用函数await生成的promise 。async这个promise 将由函数体代码中返回的promise 来解决。

如果TestFunc不是异步函数,则为

await TestFunc();

运算await符的操作数是由TestFunc. 有效的区别是TestFunc不能在内部使用await运算符而不将其更改回异步函数。


推荐阅读