2012-01-30 78 views
2

我在循環中反覆調用google api函數。 每次我想刪除地址數組中的一個元素。javascript - google地理編碼 - 關閉/循環問題

for(var i = 0; i < AddressObject.addressToArray.length; i++){    
    srPerformGeocode(AddressObject);  
    console.log(AddressObject.addressToArray); 
    AddressObject.addressToArray.splice(0, 1);     
} 
    // -------------------------------------------------------------- 
    // Perform geocoding 
    // -------------------------------------------------------------- 
    function srPerformGeocode(AddressObject) 
    {  
     address = AddressObject.addressToArray.join(","); 
     console.log(AddressObject.addressToArray);  
     if (geocoder){      
      geocoder.geocode({'address': address.trim() }, function (results, status) 
      {           
       if (status == google.maps.GeocoderStatus.OK){     
        console.log("geocoded " + AddressObject.addressToArray); 
             // Do something 
       } 
       else{     
        alert("FAIL"); 
       } 
      }); 
     } 
    } 

這似乎是發生的是,循環運行我的時間, 和功能srPerformGeocode運行每次我使用時間的 我循環的最後一個值。

['field1' ,'field2' ,'field3' ,'field4' ] 
['field1' ,'field2' ,'field3' ] 
['field1' ,'field2' ] 
['field1' ] 
geocoded field1 
geocoded field1 
geocoded field1 
geocoded field1 
+0

[Javascript閉合內部循環 - 簡單實用示例]的可能重複(http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – rds 2013-01-17 17:56:22

回答

1

這不是一個閉合的問題,因爲你從來沒有真正關過任何變量(除srPerformGeocodeaddress,但這對你的問題無關緊要)。 Read more about what closures are here.

JavaScript passes objects by reference ,所以你周圍傳遞的循環的每次迭代相同的陣列(和因而的srPerformGeocode每次調用)。

直到異步回調執行–地理編碼服務稱爲與你在第一盤控制檯輸出看參數,但在執行回調,並在登錄這實際上是精「的地理編碼的......」 ,因爲在循環的最後一次迭代之後它才存在,所以只會看到AddressObject,因爲循環很久以前就完成了(這是異步JavaScript的本質)。

解決您的問題的方法是通過的srPerformGeocode每次調用一個複製AddressObject陣列的。方便的是,數組有一個返回新數組的方法。 (splice只修改一個數組;它不創建一個新的。)

for (var i = 0; i < AddressObject.addressToArray.length; i++) {    
srPerformGeocode(AddressObject.slice(0, -i)); 
} 

(注意,這是一個淺拷貝;也就是說,陣列中的任何對象仍指向同一個對象作爲原始數組這不要緊,在這裏,因爲你的陣列是滿的原語)

其他一些注意事項:

  1. String.trim不能在IE ≤ 8存在的,所以你要address.trim()調用將拋出一個異常。
  2. 谷歌地圖並不真正做批量地理編碼;如果您進行過多的地理編碼呼叫,您可能會發現自己的速度有限,甚至完全關閉。

1個學究會同意這種說法;請參閱linked答案。

+0

感謝您的耐心解釋! – 2012-01-31 03:47:59

0

當您的回調被地理編碼API調用時,AddressObject.addressToArray已被更改。你最好堅持你傳遞的字符串(而不是對象)。

我懷疑這會給你,你之後的結果:

console.log("geocoded " + address.trim());