2013-03-26 131 views
0

我在我的谷歌地圖代碼中處理這個問題,但它實際上是一個架構問題。在某些時候,由於谷歌地圖有這麼多的請求限制了響應,並且在那一點上我想要延遲另一個請求,但是當我再次調用function2時,它說 表示「數組未定義」。javascript變量在函數內部丟失

function1() { 
    var array = JSON.parse(xmlhttp.responseText); 

    for (i; i < length; < i++) { 
     function2(array[i].one, array[i].two); 
    } 

    function3() { 
     //render directions 
    } 

    function2(start, end) { 
     directionsService.route({ 
      origin: start, 
      destination: end, 
     }, 

     function (result, status) { 
      if (status == google.maps.DirectionsStatus.OK) 
       function3(result); 
      else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) 
       var functionStr = "function2(array[i].one" + ',' + "array[i].two)"; 
      setTimeout(functionStr, 5000); 
     }); 
    } 

} 

回答

6

這是因爲當你使用的代碼串setTimeout()它在全球範圍內,不知道array得到執行。全球範圍也不會知道關於i;即使這樣做,i的價值已經不再有效。

,如果你在一個匿名函數包裝的功能代碼,這樣它應該工作:

setTimeout(function() { 
    function2(start, end); 
}, 5000); 

請注意,您可以簡單地重用startend這裏,因爲這些值已被保護,以防止在改變i變量。

順便說一句,你可以考慮序列化所有的谷歌請求,即一個請求之後,以防止這些速度問題。

0

你的setTimeout中的函數是在一個單獨的範圍內執行的,而不是在數組變量的範圍內。你可以把它包裝在一個匿名函數中。

在這裏看到: How can I pass a parameter to a setTimeout() callback?

所以,你的代碼是:

function (result, status) { 
      if (status == google.maps.DirectionsStatus.OK) { 
       function3(result); 
      } else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) { 
       setTimeout(function() { 
        function2(array[i].one, array[i].two); 
       }, 5000); 
      } 
     }); 

請心目中,你的代碼是缺少大括號{}爲你如果ELSEIF語句。我已經添加了這些。