使用异步函数返回 Promise

w0f*_*w0f 1 javascript node.js es6-promise

鉴于以下两个实现(在 ES6 / NodeJS 中)

async TestFunc() {
    return new Promise((resolve,reject) => {
        ...
    });
}
Run Code Online (Sandbox Code Playgroud)

TestFunc() {
    return new Promise((resolve,reject) => {
        ...
    });
}
Run Code Online (Sandbox Code Playgroud)

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

await TestFunc();
Run Code Online (Sandbox Code Playgroud)

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

tra*_*r53 5

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

使用承诺来解决承诺会使已解决的承诺在解决承诺变得解决时具有解决承诺的解决状态和价值。

所以总是在第一次调用时从异步函数体同步返回承诺P立即将通过调用异步函数返回的承诺的结果与P的结果联系起来。对于同步返回的 Promise 来说,这是一个不必要的步骤,并且不需要async声明函数。

如果TestFunc是异步函数,对于

await TestFunc();
Run Code Online (Sandbox Code Playgroud)

操作await符的操作数是调用async函数生成的promise 。这个承诺将通过函数体代码中返回的承诺来解决。

如果TestFunc不是异步函数,对于

await TestFunc();
Run Code Online (Sandbox Code Playgroud)

运算await符的操作数是由 构造和返回的承诺TestFunc。有效的区别是TestFunc不能在内部使用await操作符而不将其改回异步函数。