为了账号安全,请及时绑定邮箱和手机立即绑定

SETTimeout函数立即调用,而不是在延迟后调用。

SETTimeout函数立即调用,而不是在延迟后调用。

森栏 2019-07-03 10:56:26
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 回答

?
米脂

TA贡献1836条经验 获得超3个赞

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

setTimeout(GetUsersNumber, 5000);

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


查看完整回答
反对 回复 2019-07-03
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

setTimeout接受一个函数作为参数。您要做的是立即执行该函数,而传递则是退出函数的返回值。经过,穿过GetUsersNumber而不是GetUsersNumber()..()将已经执行该函数。

setTimeout(GetUsersNumber, 50000);

附带说明:

  • 大多数现代浏览器本机支持XMLHttpRequest。因此,不需要使用ActiveXObject。
  • 对于较旧的浏览器,if条件无论如何都会产生错误。这样做:

    if(window.XMLHttpRequest)


查看完整回答
反对 回复 2019-07-03
  • 2 回答
  • 0 关注
  • 635 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信