我的心跳并没有暂停超时值

时间:2016-09-02 21:11:13

标签: javascript settimeout

我有一些大型表单在会话超时之前导致填写问题。我需要一个小的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运行一次。我错过了什么?

2 个答案:

答案 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到达。