2013-03-26 3 views
0

Google지도 코드에서이 문제를 다루고 있지만 아키텍처 문제는 실제로 발생합니다. 어떤 시점에서 너무 많은 요청 구글 맵스는 응답을 제한하고, 그 시점에서 지연과 함께 다른 요청을하고 싶지만 function2를 다시 호출 할 때 에 "배열이 정의되지 않았습니다"라고 표시됩니다. 당신이 setTimeout() 사용하여 코드의 문자열을 사용하는 경우이 약 array을 모르는 전역 범위에서 실행됩니다 때문입니다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

. 전역 범위도 i에 대해 알지 못할 것입니다. 그랬더라도 i의 값은 이미 더 이상 유효하지 않습니다.

이 같이 익명 함수에서 함수 코드를 래핑 경우 작동합니다 :

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

그 값이 변경으로부터 보호되어 있기 때문에 단순히 여기 startend를 재사용 할 수 있습니다 i 변수입니다.

Btw를 사용하면 모든 Google 요청 (즉, 하나의 요청에 이어 해당 요청의 속도 문제를 방지하기 위해)을 직렬화하는 것을 고려해 볼 수 있습니다.

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 문. 나는 이것을 추가했다.

관련 문제