确保setInterval不会重复

时间:2012-03-16 15:13:19

标签: javascript jquery node.js socket.io

我正在使用带有socket.io的Node.js,并为计时器设置setInterval。

我有以下内容。我正在清除断开间隔,并在设置间隔之前进行检查。但是,如果我刷新页面很多,似乎不准确。控制台日志将以比一秒钟快得多的间隔显示“时间”并组合在一起。

有什么建议可以确保新计时器永远不会启动多次?

socket.on('disconnect', function () {
    console.log('Disconnected');
    clearInterval(timer);
}); 

if (typeof timer != 'undefined') {
    clearInterval(timer);
}

var timer = setInterval(function() {
    console.log('time');
}, 1000);

2 个答案:

答案 0 :(得分:8)

  

有什么建议可以确保新计时器永远不会启动多次?

这正是setTimeout()所做的......

如果您的意思“不止一次每秒,您需要注意setInterval()如果不是setTimeout()会导致事件堆积起来及时处理。这将导致你的差距不到一秒钟。

唯一的答案是在超时处理程序本身内使用setTimeout启动新的一次性计时器。在其自己的回调中递归调用{{1}}可确保一次只有一个计时器事件放在事件队列中。

答案 1 :(得分:-1)

页面重新加载会杀死所有计时器。问题出现在浏览器中:当你创建1秒间隔时,调用alert Mozilla的SpiderMonkey间隔事件在警报关闭后变为1秒,而Google的V8在警报<1后运行1秒强>称为即可。 这是关于引擎中不同的代码流组织。