2014-12-25 1 views
2

서버를 압도하지 않도록 5 초마다 업데이트되는 값을 HTML 페이지에 만들고 싶습니다. 내 함수 내부의 setTimeout()이 제대로 지연되지 않고 대신에 바로 호출되는 것으로 나타났습니다. 누군가 제가 단서를 찾도록 도와 줄 수 있습니까? 훨씬 많은 AJAX를 구현해야하기 때문에 서버를 너무 많이 사용하고 싶지 않습니다.setTimeout은 지연 후 대신 즉시 함수를 호출합니다.

여기서 코드이다 :

window.onload = function GetUsersNumber() { 
    aside = document.getElementById("users"); 
    if (XMLHttpRequest) var x = new XMLHttpRequest(); 
    else var x = new ActiveXObject("Microsoft.XMLHTTP"); 
    x.open("GET", "users_count.php", true); 
    x.send(); 
    x.onreadystatechange = function() { 
     if (x.readyState == 4) { 
      if (x.status == 200) aside.innerHTML = x.responseText; 
      setTimeout(GetUsersNumber(), 50000); 
     } 
    } 
} 
+0

예상되는대로 작동하지 않는 루프에서 setTimeout 호출 가능 (http://stackoverflow.com/questions/19714453/calling-settimeout-in-a-loop-not-working-as-expected) –

+0

http://stackoverflow.com/questions/15682524/settimeout-in-nodejs-loop 및 기타 여러 질문. –

+0

@ 토라자부로 : 둘 다 정확히 정식입니다. 이 중 하나가되지 않을 수도 있습니다,하지만 지금은 꽤 괜찮은 모양에 속았다 고 생각하지만, 더 비틀기는 아마도 여전히 도움이 될 것입니다. –

답변

2

함수 객체 자바 스크립트에서 한 것입니다. 함수은 다른 점입니다. 함수 이름 * 뒤에 괄호를 포함하여 후자를 사용하고 있지만 괄호없이 앞의 괄호를 사용해야합니다. 이렇게하면 setTimeout 나중에 전달 된 개체를 사용하여 함수 자체를 호출 할 수 있습니다. 당신이 실제로 (오히려 50초보다 원래의 코드가 사용되었다) 5 초 싶어 가정 :

setTimeout(GetUsersNumber, 5000); 

정말, 함수 객체를 보유하고 오래된 변수가 그런 식으로 호출 할 수 있습니다 * 하지만 편의를 위해, 함수 정의는 변수 이름을 정의합니다.

3

의 setTimeout 파라미터로서의 기능 걸린다. 당신이하고있는 일은 바로 함수를 실행하고 전달 된 함수의 반환 값입니다. GetUsersNumber() 대신 GetUsersNumber을 전달하십시오.()는이 함수를 이미 실행합니다. 보조 노트에

setTimeout(GetUsersNumber, 50000); 

:

  • 현대적인 브라우저의 대부분은 기본적으로 XMLHttpRequest를 지원합니다. 따라서 ActiveXObject를 사용하지 않아도됩니다.
  • 오래된 브라우저의 경우 if 조건은 어쨌든 오류가 발생합니다. 이 작업을 수행합니다 : if(window.XMLHttpRequest)