2014-09-02 100 views
1

我有1000個LatLngBounds對象var recBounds = []; 對於它們中的每一個數組,我想創建和顯示一個矩形,得到谷歌海拔服務矩形中心的高度和顏色取決於矩形高程值。處理許多異步請求

function getElevation() { 
     elevs = []; 
     for (i = 0; i < recBounds.length; i++) { 
      var elevation; 
      var locations = []; 
      locations.push(recBounds[i].getCenter()); 
      var positionalRequest = { 'locations': locations } 
      var elevator = new google.maps.ElevationService(); 
      elevator.getElevationForLocations(positionalRequest, 
      function (results, status) { 
       if (status == google.maps.ElevationStatus.OK) { 
        if (results[0]) { 
         elevation = results[0].elevation; 
         elevs.push(elevation); 
         if (recBounds.length == elevs.length) { 
          createRect(); 
         } 
        } 
       } 
      }) 
     } 
    } 

(我通過陣列中的每個LatLngBounds對象迭代而不是整個陣列傳遞到異步函數,因爲海拔服務只接受約300位置。)

的問題是,海拔服務似乎返回海拔結果的順序不是對應於recBounds陣列。我猜想,某些緩存位置的高程立即返回並存儲在elevs數組的頂部。因此,當我嘗試顯示矩形時,例如recBounds[4]不對應於elevs[4]的海拔。

我試圖通過LatLngBounds作爲getElevationForLocations()函數的參數,稍後使用它來創建一個具有匹配邊界和高程但沒有運氣的新數組。 任何想法如何實現這個?

+0

請提供一個[最小,完整,測試和可讀的示例](http://stackoverflow.com/help/mcve)(包括示例數據以複製問題,需要任何HTML/CSS /外部javascript)。 – geocodezip 2014-09-02 15:18:48

+0

什麼是createRect()? – geocodezip 2014-09-02 15:49:41

+0

您需要處理[OVER_QUERY_LIMIT狀態](http://stackoverflow.com/search?q=%5Bgoogle-maps-api-3%5D+OVER_QUERY_LIMIT)(目前您默默忽略任何不是「OK」的退貨狀態「)。將請求數量減少到可能的最小數量(使用每個請求中可以放置的最大數量的位置)可能是有意義的。 – geocodezip 2014-09-02 16:04:07

回答

2

如果您知道有多少結果會提前,那麼不用推入數組,每個函數都會將結果放入結果數組中的特定點。

如:

function getElevation() { 
    var elevs = []; 
    var locations = []; 

    for (i = 0; i < recBounds.length; i++) { 
     var elevation; 

     locations[i] = recBounds[i].getCenter(); 

     var positionalRequest = { 'locations': locations }; 

     var elevator = new google.maps.ElevationService(); 

     elevator.getElevationForLocations(positionalRequest, (function (index) { 
      return function (results, status) { 
       if (status == google.maps.ElevationStatus.OK) { 
        if (results[0]) { 
         elevation = results[0].elevation; 
         elevs[index] = elevation; 
         if (recBounds.length == elevs.length) { 
          createRect(); 
         } 
        } 
       } 
      } 
     })(i)); 
    } 
} 

我還沒有試運行的代碼,但在理論上它應該工作,或至少給你一個方向考慮。異步調用的結果被封裝在另一個函數中,以允許它訪問循環中的索引。

希望這對你有一些幫助。