【问题标题】:setTimeout calls function immediately instead of after delaysetTimeout 立即而不是延迟后调用函数
【发布时间】:2020-08-22 11:10:57
【问题描述】:

我想在 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);
        }
    }
}

【问题讨论】:

标签: javascript function-pointers settimeout


【解决方案1】:

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

setTimeout(GetUsersNumber, 50000);

附注:

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

【讨论】:

    【解决方案2】:

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

    setTimeout(GetUsersNumber, 5000);
    

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

    【讨论】:

      猜你喜欢
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多