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

时间:2014-12-25 02:12:09

标签: javascript function-pointers settimeout

我想在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 个答案:

答案 0 :(得分:3)

setTimeout将函数作为参数。你正在做的是立即执行该函数,并传递已执行函数的返回值。 通过GetUsersNumber代替GetUsersNumber()。 ()已经执行了该函数。

setTimeout(GetUsersNumber, 50000);

旁注:

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

答案 1 :(得分:2)

JavaScript中的函数对象是一回事。功能调用是另一回事。你通过在函数名*之后加上括号来使用后者,但是你需要前者,没有括号。这允许setTimeout稍后通过使用传入的对象来调用函数本身。假设你确实想要5秒(而不是原始代码使用的50秒):

setTimeout(GetUsersNumber, 5000);

* 实际上,任何包含函数对象的旧变量都可以这样调用,但为了方便起见,定义函数也为它定义了一个变量名。 < / p>