-1
votes

ASYNC Fonction de sortie du tableau blanc en dehors de la portée

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 commentaires

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 juste avant votre IDS [0] .foreseach ligne et tout marchera


Il y a plusieurs erreurs telles que l'utilisation de async sur une boucle de foresach. Alors vous utilisez .Chen () avec attendre 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


4 Réponses :


-1
votes

fonction asynche à l'intérieur d'un foreach ne pas attendre la réponse de l'axios.

Essayez d'utiliser car-in-in boucle xxx


1 commentaires

De plus, vous ne devez pas nécessiter que l'instruction . L'opération d'attente renvoie directement la réponse de l'opération asynchrone à la variable assignée.



0
votes
   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

0 commentaires

2
votes

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)) 
}))


0 commentaires

0
votes

@shubham a proposé la solution la plus efficace ( 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.

Si possible, 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;
}));


0 commentaires