2010-01-02 2 views
1
function load_result() 
{ 
    $.getJSON("http://somesite.com/loadresult.php", function(data) { 
     if(data == undefined || data == null) 
     { 
      console.log("no data"); 
      clearTimeout(lr_timeout); 
      lr_timeout = setTimeout("load_result()", 2000); 
      return; 
     } 
     insert_result_price(data); 
     clearTimeout(lr_timeout); 
     lr_timeout = setTimeout("load_result()", 50 * (Math.random() * 10)); 

    }); 
} 

lr_timeout은 전체적으로 정의되고 load_result 함수는 document.ready 함수에서 처음에 시작됩니다. 문제는 함수가 항상 실행되지 않는다는 것입니다. Firebug에서 살펴보고 setInterval에 설정된 다른 함수를 항상 사용할 수 있습니다.왜 setTimeout은 변덕스럽고 반 기능적입니까?

아이디어가 있으십니까?

+1

다소 관계가 없습니다 :'setTimeout()'의 문자열 인수는 evil [tm]입니다. 이 경우에는 함수 참조를 전달하십시오 ... – Christoph

답변

1

다른 setTimeout 기능 (항상 작동하는 기능)은 $.getJSON 안에 있습니까? 그렇다면 동일한 URL (예 : http://somesite.com/loadresult.php)에서 호출 할 수 있습니까? 그렇지만 실제로는 다릅니다.

http://somesite.com/loadresult.php이 희미한 리소스 일 수 있으며 일치하지 않는 결과는 setTimeout이 아닌 해당 리소스 때문일 수 있습니다. 물론 둘 다 같은 리소스를 사용한다면 문제가 될 수 없습니다.

+0

실제로 setInterval이며 loadresult 리소스와 관련이 없습니다. – Shamoon

+0

하지만 jboxer가 말했듯이, 그것이 박편이 아닌 소스인지 확인 했습니까? 데이터가 null이거나 정의되지 않은 경우 코드의 setTimeout이 호출되지 않습니다. – Annie

0

일반적으로 setTimeout에 문제가 발생하지 않았으며 문제가 발생하지 않고 JS에서 주/무한 루프에 자주 사용했습니다. 나는 loadTimeres의 한 번의 호출에서 clearTimeout이 다른 setTimeout을 밟고 있다고 생각할 것이다. 특히 브라우저가 다음 setTimeout으로 돌아가는 데 걸리는 시간보다 오래 걸릴 수있는 GET 요청에 대한 응답이기 때문이다. 실제로 여기에 여러 개의 스레드가 있으며, 제어 할 수 없으며 사용할 수있는 동기화 메커니즘이 없습니다.

+0

글쎄 .. 콜백에 있기 때문에 GET의 응답을 기다리지 않겠습니까? – Shamoon

+0

사실, 그들은 순차적으로 진행되어야합니다. 내 유일한 제안은 clearTimeout을 없애고 차이가 있는지 확인하는 것입니다. – flatline

관련 문제