2014-07-22 85 views
-1

所以我有一個對象具有以下屬性的數組:AddressLatitudeLongitude,並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進行了安慰,則循環似乎只會更新數組中的最後一項。

+2

將信息記錄到控制檯後,您可以檢查poiArray並查看它是否已更新?而for循環可能已經完成,我*想*變量應該更新。即使您認爲數據尚未更新,您的其他代碼是否仍然開始運行? –

+1

地理編碼器是異步的。從服務器返回時,結果會從服務器返回。你可以通過函數關閉來解決你的問題。 – geocodezip

+1

您正在發出一個**異步**請求 - 在您到達當前循環迭代結束時,您的數據尚不可用,這是回調函數的全部目的。這是一個很好的閱讀你 - http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call。 – Adam

回答

2

你可以用函數關閉來解決你的問題。另外,您不應使用Google Maps JavaScript API v3(.k,.B)的未公開屬性,它們將隨API更新而更改,並破壞您的代碼。

var geocoder = new google.maps.Geocoder(); 
function geocodeAddress(curr, i) { 
    geocoder.geocode({ 'address': curr.address }, function(results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     cur.lat = results[0].geometry.location.lat(); 
     cur.long = results[0].geometry.location.lng(); 
    } else { 
     console.log('failed to include ' + curr.title); 
     poiArray.splice(i--, 1);  
    } 
    }); 
} 
for (i=0; i < poiArray.length; i++) { 
    var curr = poiArray[i]; 
    if (!curr.lat || !curr.long) { 
     geocodeAddress(curr, i); 
    } 
} 
+1

這是否需要函數在繼續執行for循環的下一次迭代之前完成地理編碼調用?如果是這樣,它可能會阻止代碼與相當少數的呼叫 –

+0

華晨。這工作完美,並顯示我在哪裏玩傻瓜。感謝您指出.k .B問題。 – invot

+0

@ wolffer-east:最終用戶不會執行此腳本。管理員只能在藍色月亮中運行一次。如果在這種情況下有點緊張,那麼它有關係嗎? – invot

相關問題