2016-09-02 26 views
2

我有几个大型表格导致会话超时前填写问题。我需要一个小小的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〜4毫秒。我错过了什么?

回答

2

那就是“setTimeout问题”。人们忘记了什么setTimeout:

function setTimeout(func){ 
//wait 
func(); 
} 

所以你需要传递一个函数来设置超时。你真正要做的是:你通过功能的结果: 你做什么:

setTimeout(func(parameter),1000); 

你想要做什么:

setTimeout(func,1000); 

但如何传递参数?那很简单:

setTimeout(function(){func(parameter)},1000); 
1
setTimeout(heartbeat(heartbeaturl), data.time); 

应该是因为:

setTimeout(function() { 
    heartbeat(heartbeaturl); 
}, data.time) 

否则heartbeat(heartbeaturl)立即无需等待data.time要达到执行。

+1

Akternative创造一个新的匿名函数传递参数,如以'setTimeout'如此 - '的setTimeout(心跳,data.time,heartbeaturl)'。延迟后的任何内容在执行时都会传递到延迟函数上。 – vlaz