Leí en esta pregunta de desbordamiento de pila async/await devuelve implícitamente la promesa? que:
"Una función asíncrona siempre devolverá una promesa. Si no devuelve explícitamente una promesa, el valor que devuelve se incluirá automáticamente en una promesa".
Entonces, ¿por qué mi función getData2() continuación devuelve 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 })();getData2 devuelve una Promesa, pero la está await , lo que extrae el valor de resolución de la Promesa.
console.log(await getData2());se convierte en
console.log(await promiseThatResolvesToUndefined); console.log(undefined); Si no lo await , verás la Promesa.
const getData2 = async () => { setTimeout(() => { return 'this is the data without an explicit promise'; }, 1000); }; (async () => { console.log(getData2()); })(); El valor de resolución no está undefined porque no se devuelve nada dentro del cuerpo de getData2 .
El problema no es con async sino con el uso de return dentro de una función interna (en este caso, una lambda), que regresa desde esa función interna ( no la función externa), y setTimeout luego ignora ese valor de retorno. La forma correcta de hacer esto es getData (pero sin la palabra clave async que agrega una segunda capa de Promise ).