Je travaille avec une fonction ASYNC pour essayer de tirer des données dans un tableau avec Axios. Lorsque je connecte les données à l'intérieur du pourcheach ci-dessous, il apparaît, mais lorsque je le connecte à l'extérieur du pourcheach, il retourne en blanc. Je suppose que c'est parce que le programme est toujours en cours d'exécution, mais je ne sais pas comment résoudre sans délai d'expiration.
const user = async(IDs) => { var output; var URL; var result = []; IDs[0].forEach(async(id) => { URL = "https://example-api.com/" + id; output = await axios.get(URL) .then(function(data){ result.push(data.data.text); console.log(result) // Returns the data }); }) console.log(result) // returns blank }
4 Réponses :
fonction asynche à l'intérieur d'un Essayez d'utiliser foreach code> ne pas attendre la réponse de l'axios.
car-in-in code> boucle p>
De plus, vous ne devez pas nécessiter que l'instruction code>. L'opération d'attente renvoie directement la réponse de l'opération asynchrone à la variable assignée.
const user = async(IDs) => { var output; var URL; var result = []; for (const id of IDs[0]) { URL = "https://example-api.com/" + id; try { output = await axios.get(URL); result.push(data.data.text); } catch (error) { console.log(error) } } } Give it a try
Toutes les autres solutions sont bonnes mais elles récupèrent des données un par un et cela rend votre code un peu plus lent.
Utilisez cette approche car elle profitera pleinement de la boucle d'événement et cela exécutera votre programme beaucoup plus rapidement. . P>
const result = await Promise.all(IDs[0].map(id => { return axios.get(`https://example-api.com/${id}`) .then(data => (data.data.text)) }))
@shubham a proposé la solution la plus efficace ( Si possible, promess.All code> et
array.map code>), cependant, combinant
async code> /
attendre code> avec
promesse.Tren code> peut tuer la lisibilité, d'autant plus que la complexité augmente.
attendre code> devrait être préféré à
promesse.then : P>
const result = await Promise.all(IDs[0].map(async id => {
const data = await axios.get(`https://example-api.com/${id}`);
return data.data.text;
}));
utiliser au lieu de
Il ne s'agit tout simplement pas parce que vous appelez une fonction async à l'intérieur de la boucle de Foraach. Pour que cela fonctionne, ajoutez simplement
attendre code> juste avant votre
IDS [0] .foreseach code> ligne et tout marchera
Il y a plusieurs erreurs telles que l'utilisation de
async code> sur une boucle de foresach. Alors vous utilisez
.Chen () code> avec
attendre code> qui n'a pas vraiment vraiment de sens
Aussi pertinent: Pourquoi ma variable est-elle non altérée après que je la modifie à l'intérieur d'une fonction? - Référence de code asynchrone