2013-03-26 129 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语句。我已经添加了这些。