Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 回调被调用多次,但我只希望最后一次回调_Javascript_Google Maps Api 3 - Fatal编程技术网

Javascript 回调被调用多次,但我只希望最后一次回调

Javascript 回调被调用多次,但我只希望最后一次回调,javascript,google-maps-api-3,Javascript,Google Maps Api 3,我使用谷歌地图自动完成。由于这并不总是返回一个邮政编码,也不可能限制为多个国家,因此我调用一个反向地理编码函数来检查邮政编码和国家,并检查结果是否仅在想要的国家范围内: var geocoder; function in_array(needle, haystack) { for(var i in haystack) { if(haystack[i] == needle) return true; } return false; } function

我使用谷歌地图自动完成。由于这并不总是返回一个邮政编码,也不可能限制为多个国家,因此我调用一个反向地理编码函数来检查邮政编码和国家,并检查结果是否仅在想要的国家范围内:

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');
                }
            }
        });
    });
});
var地理编码器;
_数组中的函数(针、草垛){
for(草堆中的变量i){
如果(haystack[i]==针)返回true;
}
返回false;
}
函数getPostal(loc,回调){
var countrys=新数组('DE','AT','CH');
if(!地理编码器){
geocoder=新的google.maps.geocoder();
}
var geocoderRequest={
“latLng”:loc
}
geocoder.geocode(geocoderRequest,函数(结果,状态){
var country=“”;
var-zip=“”;
if(status==google.maps.GeocoderStatus.OK){
对于(var i=0;i
如果选择f.e.Berlin,我只会得到“OK”。 但选择f.e.纽约时,我先得到“OK”,然后是“错误的国家”。 如果选择f.e.Westport,爱尔兰,我甚至会得到“OK”、“no zip”和“错误的国家”

因为我只想在得到一个“OK”后采取进一步的行动,我该怎么做? 或者用另一种方式提问:如何获得一个单一的返回值

谢谢
Fabian

当任何条件匹配时,您必须离开
geocode
-回调,并在末尾执行
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
    }

 }); 
geocoder.geocode(geocoderRequest,函数(结果,状态){
var country=“”;
var-zip=“”;
if(status==google.maps.GeocoderStatus.OK){
对于(var i=0;i
当任何条件匹配时,您必须离开
geocode
-回调,并在末尾执行
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
    }

 }); 
geocoder.geocode(geocoderRequest,函数(结果,状态){
var country=“”;
var-zip=“”;
if(status==google.maps.GeocoderStatus.OK){
对于(var i=0;i