2013-10-10 81 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 –