簡體   English   中英

setTimeout 立即調用函數而不是延遲調用

[英]setTimeout calls function immediately instead of after delay

我想在 HTML 頁面上創建一個值,該值將每 5 秒更新一次,以免使服務器不堪重負。 事實證明,我的函數中的 setTimeout() 沒有正確延遲,而是立即被調用。 有人可以幫我找到線索嗎? 我真的不想讓我的服務器做太多工作,因為我必須實現更多的 AJAX。

這是代碼:

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);
        }
    }
}

setTimeout 接受一個函數作為參數。 您正在做的是立即執行函數並傳遞執行函數的返回值。 傳遞GetUsersNumber而不是GetUsersNumber() () 將已經執行該函數。

setTimeout(GetUsersNumber, 50000);

旁注:

  • 大多數現代瀏覽器本身都支持 XMLHttpRequest。 因此,不需要使用 ActiveXObject。
  • 對於較舊的瀏覽器, if 條件無論如何都會出錯。 這樣做: if(window.XMLHttpRequest)

JavaScript 中的函數對象是一回事。 函數調用是另一回事。 您正在使用后者,方法是在函數名稱 * 之后包含括號,但您需要前者,沒有括號。 這允許setTimeout稍后使用傳入的對象調用函數本身。 假設您確實需要 5 秒(而不是原始代碼使用的 50 秒):

setTimeout(GetUsersNumber, 5000);

*實際上,任何持有函數對象的舊變量都可以這樣調用,但為了方便起見,定義函數還為其定義了變量名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM