async/await return Promise { <pending> }

泪湿孤枕 提交于 2020-01-06 13:10:43

问题


my question is: why does this log 'promise {pending}' despite of i used async/await? I checked similar questions and answers on them and it seems like it should be okay but it is not. How do i change it to get the result and why? Thank you.

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:


async-await is really just syntactic sugar for promises, it doesn't make asynchronous code run synchronously (i.e. it doesn't block code execution). Your code is equivalent to the following:

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

(Yes, I know the above code demonstrates an anti-pattern. It's for illustrative purposes)

As you can see, what an async function really does is to implicitly return a promise that gets resolved with the value you eventually return inside the function (or rejected if you throw something). This is why async-await can only be used on functions and thus isn't applicable on the top level.

The context that called the function is entirely agnostic to the fact that the function is async, it just calls the function, gets a promise back and moves on to the next line of code. Your console.log() lives in this outside context and only sees the promise that was returned.



来源:https://stackoverflow.com/questions/52120218/async-await-return-promise-pending

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!