簡體   English   中英

回調被多次調用,但是我只希望最后一次回調

[英]callback is called multiple times, but I want last callback only

我使用谷歌地圖自動完成功能。 由於這並不總是返回zip,並且不可能限制為多個國家,因此我調用了反向地址解析功能來檢查zip和國家,並檢查結果是否僅在所需的國家/地區內:

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');
                }
            }
        });
    });
});

如果選擇柏林,我只會得到“確定”。 但是選擇紐約,我首先得到“確定”,然后是“錯誤的國家”。 如果選擇愛爾蘭的韋斯特波特,我什至會得到“確定”,“沒有拉鏈”和“錯誤的國家”。

我只想獲得一個“ OK”就想采取進一步的行動,我該怎么做呢? 或以另一種方式質疑:如何獲得一個單一的返回值?

謝謝費邊

您必須在任何條件匹配時保留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
    }

 }); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM