How to return values from async functions using async-await from function?

173,757

Solution 1

You cant await something outside async scope. To get expected result you should wrap your console.log into async IIFE i.e

async function getData() {
  return await axios.get('https://jsonplaceholder.typicode.com/posts');
}

(async () => {
  console.log(await getData())
})()

Working sample.

More information about async/await

Since axios returns a promise the async/await can be omitted for the getData function like so:

function getData() {
  return axios.get('https://jsonplaceholder.typicode.com/posts');
}

and then do same as we did before

(async () => {
   console.log(await getData())
})()

Solution 2

your function getData will return a Promise.

So you can either:

  • await the function as well to get the result. However, to be able to use await, you need to be in an async function, so you need to 'wrap' this:

    async function callAsync() {
       var x = await getData();
       console.log(x);
    }
    callAsync();
    

    (I named the function for sake of clarity, but in this scenario, one would rather use an anonymous function call; see TheReason's answer.)

or

  • use the result as a normal Promise, which is what an async function returns.
    You have to use then with a callback:

    getData().then(x => { 
        console.log(x); 
    });
    

Solution 3

The other answers have covered this fine; but I'd like to chip in and say get in the habit of creating and calling a main function rather than run things in the global scope. i.e.

async function main(){
  let result = await getData();
}

main().catch(console.log);

This is pretty clear to anyone reading your code that this is your app entry point

Share:
173,757

Related videos on Youtube

King Rayhan
Author by

King Rayhan

Updated on September 04, 2021

Comments

  • King Rayhan
    King Rayhan over 2 years

    How can I return the value from an async function? I tried to like this

    const axios = require('axios');
    async function getData() {
        const data = await axios.get('https://jsonplaceholder.typicode.com/posts');
        return data;
    }
    console.log(getData());
    

    it returns me this,

    Promise { <pending> }
    
    • Pac0
      Pac0 about 6 years
      console.log(await getData()); (if this code is another function, then it need to be marked as async as well)
    • Pac0
      Pac0 about 6 years
      or treat this as a Promise, and do it the 'old' way : getData().then(x => { console.log(x); } )
    • Poul Bak
      Poul Bak almost 4 years
      @pac0: That does not return a value, which is what the question is about.
    • Friedrich
      Friedrich almost 3 years
      In the developer console the following works async function getData() {return await fetch('https://jsonplaceholder.typicode.com/posts');} followed by just await getData().
  • King Rayhan
    King Rayhan about 6 years
    (async () => { console.log(await getData()) })() what's going on here?
  • King Rayhan
    King Rayhan about 6 years
    are you running a annonymous async function. right?
  • Pac0
    Pac0 about 6 years
    but you can use another 'named' function instead, if you need.