在转换位置时,我想创建一个诸如经度和纬度之类的对象,例如实际位置的{"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);
});
}
答案 0 :(得分:1)
axios.get
没有被阻止,这意味着请求将被启动,然后代码将继续运行,然后请求完成,它将在.then
内部运行代码。您应该从geocode
函数返回诺言,然后使用async function来await
结果。
答案 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('...