2013-10-10 40 views
1

我使用谷歌地图自动完成。由于这并不总是返回一个zip文件,也不可能限制为mutliple国家,因此我会调用反向地理编码函数来检查zip和country,并检查结果是否在所需的文件中:回调被称为多次,但我只想最后回调

var geocoder; 

function in_array(needle, haystack) { 
    for(var i in haystack) { 
     if(haystack[i] == needle) return true; 
    } 
    return false; 
} 

function getPostal(loc, callback) { 
    var countrys = new Array('DE', 'AT', 'CH'); 
    if (!geocoder) { 
     geocoder = new google.maps.Geocoder(); 
    } 
    var geocoderRequest = { 
     'latLng': loc 
    } 
    geocoder.geocode(geocoderRequest, function(results, status) { 
     var country = ""; 
     var zip = ""; 
     if (status == google.maps.GeocoderStatus.OK) { 
      for(var i=0; i < results[0].address_components.length; i++) { 
       var component = results[0].address_components[i]; 
       if(component.types[0] == "country") { 
        country = component.short_name; 
       } 
       if(component.types[0] == "postal_code") { 
        zip = component.short_name; 
       } 
      }    
      callback(1); 
     } 
     if (zip == "") callback(-1); 
     if (country == "") callback(-2); 
     if (!in_array(country, countrys)) callback(-3); 
    }); 
} 

$(function() { 
    var checkPostal; 
    var input = document.getElementById('search'); 
    var options = { 
     types: ["geocode"] 
    }; 
    var autocomplete = new google.maps.places.Autocomplete(input, options); 
    google.maps.event.addListener(autocomplete, 'place_changed', function() { 
     var place = autocomplete.getPlace(); 
     latlng = place.geometry.location; 
     //reverse 
     getPostal(place.geometry.location, function(checkPostal) { ; 
      if (checkPostal == 1) { 
       alert("OK"); 
      } else { 
       if (checkPostal == -1) { 
        alert('no ZIP'); 
       } else if (checkPostal == -2) { 
        alert('no country'); 
       } else if (checkPostal == -3) { 
        alert('wrong country'); 
       } 
      } 
     }); 
    }); 
}); 

如果选择fe柏林我只有'OK'。 但是选择f.e.纽约我首先得到'OK'然后'错误的国家'。 如果选择f.e.西港,爱尔兰,我甚至可以'好','没有拉链'和'错误的国家'。

因为我想在获得一个'OK'后才能采取进一步的行动,我该怎么做? 或以其他方式提问:如何获得单一返回值?

感谢 费边

回答

1

你必须离开geocode -callback当任何条件匹配,并在年底执行callback(1) ...所以它会被执行,只有当没有匹配的条件:

geocoder.geocode(geocoderRequest, function(results, status) { 
    var country = ""; 
    var zip = ""; 
    if (status == google.maps.GeocoderStatus.OK) { 
     for(var i=0; i < results[0].address_components.length; i++) { 
      var component = results[0].address_components[i]; 
      if(component.types[0] == "country") { 
       country = component.short_name; 
      } 
      if(component.types[0] == "postal_code") { 
       zip = component.short_name; 
      } 
     }  
     if (zip == "") {callback(-1);return;} 
     if (country == "") {callback(-2);return;} 
     if (!in_array(country, countrys)) {callback(-3); return;}  
     callback(1); 
    }else{ 
     //do something when status is not OK 
    } 

}); 
+0

完美的作品,非常感谢 - Fabian –