异步/等待返回承诺 { <pending> }

And*_*rov 5 javascript node.js async-await es6-promise

我的问题是:尽管我使用了 async/await,但为什么这个日志 'promise {pending}'?我检查了类似的问题和答案,看起来应该没问题,但事实并非如此。我如何更改它以获得结果,为什么?谢谢你。

const rp = require('request-promise-native');

async function sampleFunc() {
    let sample = await rp({
        uri: 'http://google.com',
        jar: true
    });
    return sample;
}

async function f() {
    return await sampleFunc();
}

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

Len*_*olm 4

async-await实际上只是 Promise 的语法糖,它不会使异步代码同步运行(即它不会阻止代码执行)。您的代码相当于以下内容:

function sampleFunc() {
    return new Promise(function(resolve) {
        rp({
            uri: 'http://google.com',
            jar: true
        }).then(function(sample) {
           resolve(sample);
        });
    });
}

function f() {
    return new Promise(function(resolve) {
        sampleFunc().then(function(result) {
            resolve(result);
        });
    });
}

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

(是的,我知道上面的代码演示了一种反模式。它是为了说明目的)

正如您所看到的,函数真正做的就是隐式返回一个 Promise,该 Promise 会根据您最终在函数内返回的async值进行解析(或者如果您执行某些操作则被拒绝)。这就是为什么只能在函数上使用,因此不适用于顶层。throwasync-await

调用该函数的上下文完全不知道该函数的事实async,它只是调用该函数,获取一个承诺并继续执行下一行代码。你console.log()生活在这个外部环境中,只能看到回报的承诺。