2014-12-25 49 views
2

我想在HTML頁面上創建一個值,每5秒更新一次,以免壓倒服務器。事實證明,我的函數內的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

@torazaburo:這些都不是完全正規的。這個也許不是,但我認爲現在它的體形相當不錯,儘管任何更多的調整可能仍然有幫助。 –

回答

2

函數對象在JavaScript是一回事。函數調用是不同的事情。你使用後者,在函數名*之後加括號,但你需要前者,而不用括號。這允許setTimeout稍後通過使用傳入的對象調用函數本身。假設你真的想5秒(而不是50秒的原代碼使用):

setTimeout(GetUsersNumber, 5000); 

* 真的,來保存函數對象的任何舊變量可以調用這樣的,但是爲了方便,定義一個函數也爲它定義了一個變量名。

3

的setTimeout需要一個功能參數。你正在做的就是執行函數並傳遞返回的函數的值。通過GetUsersNumber代替GetUsersNumber()。 ()將已經執行該功能。

setTimeout(GetUsersNumber, 50000); 

在一個側面說明:

  • 大部分現代瀏覽器支持XMLHttpRequest本身。所以,不需要使用ActiveXObject。
  • 對於舊版瀏覽器,if條件反正會給出錯誤。這樣做:if(window.XMLHttpRequest)