¿Cómo devolver valores de funciones asíncronas usando async-await from function? [duplicar]

91

¿Cómo puedo devolver el valor de una función asíncrona? Traté de gustarme esto

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

me devuelve esto,

Promise { <pending> }
4
  • console.log (espera getData ()); (si este código es otra función, entonces también debe marcarse como asíncrono)
    Pac0
    20/04/18 a las 9:22
  • 7
    o trate esto como una Promesa, y hágalo de la manera 'antigua': getData().then(x => { console.log(x); } )
    Pac0
    20/04/18 a las 9:23
  • 5
    @ pac0: Eso no devuelve un valor, que es de lo que trata la pregunta. 4 de agosto de 2020 a las 11:40
  • En la consola del desarrollador, los siguientes trabajos async function getData() {return await fetch('https://jsonplaceholder.typicode.com/posts');}seguidos de solo await getData(). 5 de junio a las 5:55
85

No puedes hacer awaitalgo fuera del asyncalcance. Para obtener el resultado esperado, debe envolverlo console.logen async IIFE, es decir

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

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

Working muestra.

Más información sobre async/await

Dado que axiosdevuelve una promesa, async/awaitse puede omitir para la getDatafunción de la siguiente manera:

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

y luego hacer lo mismo que hicimos antes

(async () => {
   console.log(await getData())
})()
3
  • 1
    (async () => {console.log (await getData ())}) () ¿qué está pasando aquí? 20/04/18 a las 9:46
  • 1
    ¿Está ejecutando una función asíncrona anónima? ¿Derecha? 20/04/18 a las 9:46
  • 1
    pero puede usar otra función 'nombrada' en su lugar, si lo necesita.
    Pac0
    20/04/18 a las 9:49
21

su función getData devolverá una Promesa.

Entonces puedes:

  • awaitla función también para obtener el resultado. Sin embargo, para poder usar await, debe estar en una asyncfunción, por lo que debe 'ajustar' esto:

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

    (Nombré la función en aras de la claridad, pero en este escenario, uno preferiría usar una llamada de función anónima; vea la respuesta de TheReason ).

o

  • use el resultado como una Promesa normal, que es lo que devuelve una función asíncrona.
    Tienes que usar thencon una devolución de llamada:

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

Las otras respuestas han cubierto esta multa; pero me gustaría agregar y decir que se acostumbre a crear y llamar a una mainfunción en lugar de ejecutar cosas en el ámbito global. es decir

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

main().catch(console.log);

Esto es bastante claro para cualquiera que lea su código de que este es el punto de entrada de su aplicación.

0