Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript setTimeout立即调用函数,而不是延迟后调用_Javascript_Function Pointers_Settimeout - Fatal编程技术网

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

Javascript setTimeout立即调用函数,而不是延迟后调用,javascript,function-pointers,settimeout,Javascript,Function Pointers,Settimeout,我想在HTML页面上创建一个值,该值将每5秒更新一次,以避免服务器崩溃。事实证明,我的函数中的setTimeout()并没有正确延迟,而是立即被调用。有人能帮我找到线索吗?我真的不想给我的服务器太多的工作,因为我必须实现更多的AJAX 代码如下: window.onload = function GetUsersNumber() { aside = document.getElementById("users"); if (XMLHttpRequest) var x = new

我想在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秒):


      *实际上,任何保存函数对象的旧变量都可以这样调用,但为了方便起见,定义函数也会为其定义一个变量名。

      可能重复的还有其他几个问题。@torazaburo:这两个都不是完全规范的。这一个可能也不是,但我认为它现在的状态非常好,可以被愚弄,尽管任何进一步的调整可能仍然会有帮助。@Nathan:一个复杂的因素是其他问题中的
      for
      循环,这里没有。
      setTimeout(GetUsersNumber, 5000);