Lors de la conversion des emplacements, je souhaite créer un objet sous forme de lats et longs tels que {"lat":123123, "lng" : 12324} de l'emplacement réel et de le stocker immédiatement dans le tableau coordinates. Cependant, à la fin, lorsque je vérifie le tableau coordinates, il est affiché comme un tableau vide. Est-ce parce que la commande coordinates.push({"lat" : lat, "lng": lng}) ne s'exécute pas juste après avoir reçu une réponse du Web?

Je reçois tous les lats et les journaux des emplacements appropriés. Mais je ne peux pas le stocker dans un tableau.

J'ai enlevé la clé pour des raisons de sécurité. Comment puis-je stocker l'objet dans un tableau?

 var coordinates = [];
    for(var i = 0; i < locations.length; i++) {
        console.log(locations[i]);
        geocode(locations[i]);
    }


    function geocode(location) {
        axios.get('https://maps.googleapis.com/maps/api/geocode/json', {
            params : {
                address: location,
                key : 'api_key'
            }
        })
            .then(function(response){
               var lat = response.data.results[0].geometry.location.lat;
               var lng = response.data.results[0].geometry.location.lng;
               coordinates.push({"lat" : lat, "lng": lng});
               
            })
            .catch(function(error) {
                console.log(error);
            });
    }
0
Baris Ertas 31 août 2020 à 19:16

2 réponses

Meilleure réponse

Cependant, à la fin, lorsque je vérifie le tableau de coordonnées, il est affiché comme un tableau vide.

À la fin de quoi? Probablement la boucle for, auquel cas vous la lisez trop tôt. Gardez à l'esprit que les objets sont poussés vers coordinates de façon asynchrone , c'est-à-dire après la fin de votre boucle for.

Il y a plusieurs façons de contourner cela. La première serait de consigner les promesses renvoyées par Axios.get() puis de faire un Promise.all() pour consigner le tableau, une fois que toutes les promesses ont été résolues.

let coordinates = [],
    promises = [];
for(let i = 0; i < locations.length; i++) {
    console.log(locations[i]);
    promises.push(geocode(locations[i]));
}
Promise.all(promises).then(() => {
    console.log(coordinates); //will now be populated
});

Enfin, changez

axios.get('...

À

return axios.get('...
0
Mitya 31 août 2020 à 16:23

axios.get ne bloque pas, ce qui signifie que la requête sera lancée, puis le code continuera à s'exécuter, puis la requête se terminera et il exécutera le code à l'intérieur du .then. Vous devez renvoyer la promesse de la fonction geocode puis utiliser un fonction asynchrone au await résultat.

1
Aplet123 31 août 2020 à 16:20