Javascript setTimeout立即调用函数,而不是延迟后调用
我想在HTML页面上创建一个值,该值将每5秒更新一次,以避免服务器崩溃。事实证明,我的函数中的setTimeout()并没有正确延迟,而是立即被调用。有人能帮我找到线索吗?我真的不想给我的服务器太多的工作,因为我必须实现更多的AJAX 代码如下: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
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);