web-dev-qa-db-fra.com

Comment retourner des valeurs de fonctions asynchrones à l'aide de la fonction async-wait de?

Comment puis-je retourner la valeur d'une fonction asynchrone? J'ai essayé d'aimer ça

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

ça me retourne ça,

Promise { <pending> }
7
King Rayhan

Vous ne pouvez pas await quelque chose en dehors de async portée. Pour obtenir le résultat attendu, vous devez vous envelopper console.log en asynchrone IIFE i.e

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

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

Worked sample.

Plus d'informations sur async/await

Puisque axios renvoie une promesse, le async/await peut être omis pour la fonction getData de la manière suivante:

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

et ensuite faire comme nous le faisions avant

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

votre fonction getData retournera une promesse.

Donc vous pouvez soit: 

  • await la fonction aussi pour obtenir le résultat. Cependant, pour pouvoir utiliser await, vous devez utiliser une fonction async et vous devez donc "emballer" ceci:

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

    (J'ai nommé la fonction pour plus de clarté, mais dans ce scénario, on utilisera plutôt un appel de fonction anonyme; voir la réponse de TheReason.)

ou

  • utilisez le résultat comme une promesse normale, ce qui est ce qu'une fonction asynchrone retourne.
    Vous devez utiliser then avec un rappel: 

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

Les autres réponses ont couvert cette amende; mais j'aimerais intervenir et dire de prendre l'habitude de créer et d'appeler une fonction main plutôt que d'exécuter des tâches dans la portée globale. c'est à dire. 

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

main().catch(console.log);

Ceci est assez clair pour ceux qui lisent votre code qu'il s'agit de votre point d'entrée de l'application

1
Meirion Hughes