130

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> }
King Rayhan
  • 1,803
  • 3
  • 17
  • 21
  • console.log(await getData()); (if this code is another function, then it need to be marked as async as well) – Pac0 Apr 20 '18 at 09:22
  • 7
    or treat this as a Promise, and do it the 'old' way : `getData().then(x => { console.log(x); } )` – Pac0 Apr 20 '18 at 09:23
  • 7
    @pac0: That does not return a value, which is what the question is about. – Poul Bak Aug 04 '20 at 11:40
  • In the developer console the following works `async function getData() {return await fetch('https://jsonplaceholder.typicode.com/posts');}` followed by just `await getData()`. – Friedrich Jun 05 '21 at 05:55

3 Answers3

118

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())
})()
jasonleonhard
  • 8,968
  • 71
  • 54
The Reason
  • 7,045
  • 4
  • 20
  • 38
28

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); 
    });
    
darklightcode
  • 2,697
  • 1
  • 13
  • 17
Pac0
  • 19,021
  • 6
  • 60
  • 71
17

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

Community
  • 1
  • 1
Meirion Hughes
  • 23,217
  • 10
  • 67
  • 117