setTimeout 立即调用函数而不是延迟调用

IT技术 javascript function-pointers settimeout
2021-01-14 09:53:53

我想在 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);
        }
    }
}
2个回答

JavaScript 中的函数对象是一回事。函数调用是另一回事。您正在使用后者,方法是在函数名称 * 之后包含括号,但您需要前者,没有括号。这允许setTimeout稍后使用传入的对象调用函数本身。假设您确实需要 5 秒(而不是原始代码使用的 50 秒):

setTimeout(GetUsersNumber, 5000);

*实际上,任何持有函数对象的旧变量都可以这样调用,但为了方便起见,定义函数还为其定义了变量名。

setTimeout 将函数作为参数。您正在做的是立即执行函数并传递执行函数的返回值。通过GetUsersNumber而不是GetUsersNumber(). () 将已经执行该函数。

setTimeout(GetUsersNumber, 50000);

附带说明:

  • 大多数现代浏览器本身都支持 XMLHttpRequest。因此,不需要使用 ActiveXObject。
  • 对于较旧的浏览器, if 条件无论如何都会出错。做这个:if(window.XMLHttpRequest)