从Javascript中的API获取对象后,如何将对象存储在数组中?

时间:2020-08-31 16:16:41

标签: javascript arrays api object

在转换位置时,​​我想创建一个诸如经度和纬度之类的对象,例如实际位置的{"lat":123123, "lng" : 12324},然后立即将其存储到coordinates数组中。但是,最后,当我检查coordinates数组时,它显示为空数组。是因为coordinates.push({"lat" : lat, "lng": lng})命令在收到网络响应后没有立即执行?

我正在获取适当位置的所有经纬度。但是不能将其存储到数组中。

出于安全考虑,我删除了密钥。 如何将对象存储到数组中?

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

2 个答案:

答案 0 :(得分:1)

axios.get没有被阻止,这意味着请求将被启动,然后代码将继续运行,然后请求完成,它将在.then内部运行代码。您应该从geocode函数返回诺言,然后使用async functionawait结果。

答案 1 :(得分:0)

但是,最后,当我检查坐标数组时,它显示为空数组。

最后是什么?可能是for循环,在这种情况下,您读得太早了。请记住,对象被异步推送到coordinates ,即,在您完成for循环之后的

有几种方法可以解决这个问题。一种方法是记录Axios.get()返回的诺言,然后在所有诺言都解决后执行Promise.all()记录数组。

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

最后,改变

axios.get('...

return axios.get('...