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
awaitpå funktionen också för att få resultatet. För att kunna användaawaitbehöver du dock vara i enasync-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ändathenmed 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
