Search code examples
javascriptasync-awaites6-promise

Why does this aysnc function not implicitly return a promise?


I read in this Stack Overflow question async/await implicitly returns promise? that:

"An Async function will always return a promise. If you don't explicitly return a promise, the value you return will automatically be wrapped in a promise."

So why does my getData2() function below return undefined?

const getData = async() => {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('this is the data');
    }, 2000);
  });
};

const getData2 = async() => {
  setTimeout(() => {
    return 'this is the data without an explicit promise';
  }, 1000);
};

(async() => {
  console.log(await getData2()); // DOES NOT WORK: displays 'undefined' immediately
  console.log(await getData()); // WORKS: waits one second and displays data
})();


Solution

  • getData2 is returning a Promise, but you're awaiting it, which extracts the resolve value from the Promise.

    console.log(await getData2());
    

    turns into

    console.log(await promiseThatResolvesToUndefined);
    
    console.log(undefined);
    

    If you don't await it, you'll see the Promise.

    const getData2 = async () => {
        setTimeout(() => {
            return 'this is the data without an explicit promise';
        }, 1000);
    };
    
    (async () => {
        console.log(getData2());
    })();

    The resolve value is undefined because nothing is being returned inside the body of getData2.