以同样的顺序存储异步方法的响应

时间:2016-04-13 10:55:21

标签: javascript google-maps google-geocoder

我需要在数组中存储一些谷歌地图坐标,我通过地理编码器获取坐标,所以我传递城市名称或地址,它返回坐标。

我发现地理编码器必须是异步功能,因为我没有按照我要求的相同顺序给出答案。所以坐标以我需要的不同顺序存储。

例如,如果我要求巴塞罗那 - >巴黎 - >巴塞罗那答案总是巴塞罗那的坐标 - >巴塞罗那 - >巴黎或巴黎 - >巴塞罗那 - >巴塞罗那。或者如果我问巴黎 - >罗马 - >奥斯陆它以另一种顺序回答。

var address = ['Barcelona', 'Viena','Oslo'];
for (var i = 0; i < address.length; i++ ) {
   geocoder.geocode({
       'address': address[i]
   }, function (results, status) {

       if (status === google.maps.GeocoderStatus.OK) {
           lineCoordinates.push(results[0].geometry.location);
           cities.push(results[0].address_components[0].long_name);
           console.log("he terminado para:" + results[0].address_components[0].long_name);
       }
   });
}

如何以正确的顺序存储回复?

谢谢

2 个答案:

答案 0 :(得分:1)

您可以为您的目的使用回调。将您的地理编码请求发送到以下函数:

doGeocode: function (address, postal_code, callback) {
console.log("TEST: " + address.toString());
var geocoder = new google.maps.Geocoder();
geocoder.geocode({
    'address': address,
    'componentRestrictions': {
        'postalCode': postal_code,
        'country': 'de'
    }
}, function (results, status) {
    if (status === google.maps.GeocoderStatus.OK) {
        console.log(results);
        callback(results);
    } else {
        //Error handling
        alert('Geocode was not successful for the following reason: ' + status);
    }
});

现在你可以在每个回调中工作,如:

doGeocode (adress, postal_code, function (response1){
//Barcelona
  doGeocode (adress, postal_code, function (response2){
  //Viena

   doGeocode (adress, postal_code, function (response3){
      //Oslo


      //here you have all your requested information from all 3 requests
     )};
  )}; 
)};

答案 1 :(得分:1)

每个地址,lineCoordinates和city都有数组。我要废弃它,只有一个包含所有内容的数组,因此您可以使用其坐标和名称来绑定您要求的城市。

var cities = [
    {
        name: 'Barcelona',
        longName: '',
        coordinates: ''
    },
    {
        name: 'Viena',
        longName: '',
        coordinates: ''
    },  
    {
        name: 'Oslo',
        longName: '',
        coordinates: ''
    }
];

for (var i = 0; i < cities.length; i++ ) {
   geocoder.geocode({
       'address': cities[i].name
   }, function (results, status) {
       if (status === google.maps.GeocoderStatus.OK) {
           cities[i].coordinates = results[0].geometry.location;
           cities[i].longName = results[0].address_components[0].long_name;
       }
   });
}