在 for 循环中使用地图 api 进行反向地理编码期间,城市名称顺序不正确



我正在使用for循环对一堆坐标进行反向地理编码,并将每次迭代的结果存储在node.js上的数组中。但是,当我将数组发送到我的角度前端或将其记录在控制台中时,城市的顺序是随机的。我正在使用节点.js的@google/地图包装器。这是我的代码:

var gm = require('@google/maps').createClient({
key: '**********************************'
});
var x, z;
var places = [];
gm.directions({
origin: 'NYC',
destination: 'Washington DC',
}, function(err, response) {
if (!err) {
for(i=0; i<response.json.routes[0].legs[0].steps.length; i=i+3) {
x = response.json.routes[0].legs[0].steps[i].end_location; //getting the coordinates of the end location for each step
gm.reverseGeocode({latlng: [x.lat, x.lng],}, function(err, response){
if (!err) {
z = response.json.results[4].address_components[1].long_name + ', ' + response.json.results[4].address_components[2].short_name;
places.push(z);
}
});
}
}
});
setTimeout(() => {
console.log(places);
}, 5000)

如果您能告诉我我在这里做错了什么,我将不胜感激。谢谢。

更新:

Console.log(response.json.results[4](的结果 控制台结果.log(g(

首先,当你使用异步代码时,你不应该依赖setTimeout来获取值。有时timeout是不够的,你会得到错误的数据。

您可以使用callbacksasync/awaitPromises解决方案来处理异步操作并保证数据的正确性。

获取您的示例:

let gm = require("@google/maps").createClient({
key: "**********************************",
Promise: Promise
});
let x, z;
let places = [];
const directionsPromise = gm
.directions({
origin: "NYC",
destination: "Washington DC"
})
.asPromise()
.then(response => {
let geocodePromises = [];
for (i = 0; i < response.json.routes[0].legs[0].steps.length; i = i + 3) {
x = response.json.routes[0].legs[0].steps[i].end_location;
gecodePromises.push(
gm.reverseGeocode({ latlng: [x.lat, x.lng] }).asPromise()
);
}
return Promise.all(geocodePromises);
})
.then(geocodes => {
return geocodes.map(g => {
return (
g.json.results[4].address_components[1].long_name +
", " +
g.json.results[4].address_components[2].short_name
);
});
})
.catch(err => console.error(err));

directionsPromise.then(geocodes => {
// if you need
places = geocodes;
console.log(geocodes);
})

我希望这会有所帮助。

log after for loop,并检查迭代 (i=i+3(

最新更新