javascript - Hur man returnerar värden från asynkrona funktioner med async-await från en funktion?


Hur kan jag returnera värdet från en asynkron funktion? Jag försökte göra det på detta sätt

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

det returnerar detta till mig,

Promise { <pending> }

Svar #1

Du kan inte await något utanför async område. För att få förväntat resultat bör du omsluta din console.log i en async IIFE, dvs

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

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

Fungerande exempel.

Mer information om async/await

Eftersom axios returnerar ett löfte kan async/await utelämnas för getData-funktionen på följande sätt:

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

och gör sedan samma sak som vi gjorde tidigare

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

Svar #2

din funktion getData kommer att returnera ett Promise.

Så du kan antingen:

  • Använd await på funktionen också för att få resultatet. För att kunna använda await behöver du dock vara i en async-funktion, så du behöver 'omsluta' detta:

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

    (Jag namngav funktionen för tydlighetens skull, men i detta scenario skulle man snarare använda ett anrop av en anonym funktion; se TheReason:s svar.)

eller

  • använd resultatet som ett vanligt Promise, vilket är vad en async-funktion returnerar.
    Du måste använda then med en callback:

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

Svar #3

De andra svaren har täckt detta bra; men jag skulle vilja bidra och säga att man bör vänja sig vid att skapa och anropa en main-funktion istället för att köra saker i den globala omfattningen. t.ex.

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

main().catch(console.log);

Det här är ganska tydligt för vem som helst som läser din kod att detta är din appens startpunkt

Relaterade artiklar