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

时间:2018-08-31 17:25:34

标签: javascript node.js async-await es6-promise

我的问题是:尽管我使用了异步/等待,但为什么此日志“承诺{未决}”呢?我检查了类似的问题和答案,似乎应该可以,但事实并非如此。我如何更改它以获得结果,为什么?谢谢。

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

1 个答案:

答案 0 :(得分:0)

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

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

(是的,我知道上面的代码演示了反模式。这只是出于说明目的)

如您所见,async函数的真正作用是隐式地返回一个承诺,该承诺将通过您最终在函数内部返回的值来解析(如果您{{ 1}})。 这就是为什么throw仅可用于功能,因此不适用于顶层的原因。

调用该函数的上下文与该函数是async-await的事实完全不可知,它只是调用该函数,得到一个承诺并返回到下一行代码。您的async生活在这种外部环境中,只能看到返回的承诺。