所以我有一個對象具有以下屬性的數組:Address
,Latitude
,Longitude
,並Title
谷歌地圖API函數不及時返回結果
poi("139 Main St", 0, 0, "Farmer's Market"),
poi("18 N Hopkins Ave", 37.4455, -143.7728, "YMCA"),
poi("42 Universe St", 37.4855, -143.8781, "Original Pizza #32")
現在,第一個對象不具有任何設置對於經度和緯度,所以我希望使用Google的Geocode API來填寫缺失的數據。我將API腳本鏈接包含在我的API密鑰中,該密鑰工作正常。
然後,我創建了一個for
循環,該循環遍歷數組並找到缺少數據的任何對象。它應該通過並用正確的信息替換任何空單元。但是,儘管信息被檢索到,但是在循環完成之後它會這樣做。我可以輸出正確的信息,但只能在函數返回空數據之後。
for (i=0; i < poiArray.length; i++) {
var curr = poiArray[i];
if (!curr.lat || !curr.long) {
geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'address': curr.address }, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
cur.lat = results[0].geometry.location.k;
cur.long = results[0].geometry.location.B;
} else {
console.log('failed to include ' + curr.title);
poiArray.splice(i--, 1);
}
});
}
}
我試過timeout
和嵌套函數,但似乎沒有任何工作。有什麼建議麼?
讓我提更多的怪事:如果我在for循環中,我得到我的數組......每一次的最後一個數字if (status == google.maps.GeocoderStatus.OK) {
變量i
後控制檯。如果我在加載了來自Google的異步數據後對我的poiArray
進行了安慰,則循環似乎只會更新數組中的最後一項。
將信息記錄到控制檯後,您可以檢查poiArray並查看它是否已更新?而for循環可能已經完成,我*想*變量應該更新。即使您認爲數據尚未更新,您的其他代碼是否仍然開始運行? –
地理編碼器是異步的。從服務器返回時,結果會從服務器返回。你可以通過函數關閉來解決你的問題。 – geocodezip
您正在發出一個**異步**請求 - 在您到達當前循環迭代結束時,您的數據尚不可用,這是回調函數的全部目的。這是一個很好的閱讀你 - http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call。 – Adam