我有一些大型表单在会话超时之前导致填写问题。我需要一个小的javascript包含在页面的末尾,每隔几分钟ping一个文件,以便在页面打开时刷新会话超时。所以我有一个函数,最后一个语句是在一个间隙之后再次调用该函数。此外,由于一系列原因,jQuery和其他框架无法用于此目的。所以我把它放在https://stackoverflow.com/a/35970894/385011
之后var getJSON = function(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open("get", url, true);
xhr.responseType = "json";
xhr.onload = function() {
var status = xhr.status;
if (status == 200) {
callback(null, xhr.response);
} else {
callback(status);
}
};
xhr.send();
};
//hearbeat
function heartbeat(heartbeaturl){
getJSON(heartbeaturl,function(err, data) {
console.log(Date.now());
console.log(data.time);
setTimeout(heartbeat(heartbeaturl), data.time);
});
}
console.log("run heartbeat");
heartbeat("heartbeat.json")
data.time返回60000所以它应该每分钟运行一次心跳,但每1~4ms运行一次。我错过了什么?
答案 0 :(得分:2)
这就是“setTimeout问题”。人们忘记了setTimeout的作用:
function setTimeout(func){
//wait
func();
}
所以你需要传递一个函数来设置Timeout。你实际做的是:你传递函数的结果: 你做了什么:
setTimeout(func(parameter),1000);
你想做什么:
setTimeout(func,1000);
但是如何传递参数?多么容易:
setTimeout(function(){func(parameter)},1000);
答案 1 :(得分:1)
setTimeout(function () {
heartbeat(heartbeaturl);
}, data.time)
应该是:
heartbeat(heartbeaturl)
否则会立即执行{{1}}而不等待data.time到达。