在javascript中调用clearInterval后如何恢复setInterval?

时间:2012-04-29 16:14:27

标签: javascript setinterval anonymous-methods

我有这个代码可以正常工作,但我想停止轮询和clearInterval如果用户在说5次迭代后没有处于非活动状态(没有鼠标移动)而不是连续循环。

var i, active = new Date, iter = 1;

$(window).on('mousemove', function(e){
active = new Date;          
});

i = setInterval(function(){
    if(new Date().getTime() - active.getTime() < 1000){
     console.log("sending active event to server.....");
             iter = 1;  
    else{
      iter++;
        if(iter >= 5){
           clearInterval(i);
        }
     }          
}, 2000);   

现在它在这个例子中每两秒检查一次。我想检查活动日期说5次,如果它连续过期5次迭代,请调用clearInterval(i)...所以mousemove回调内部的东西应该只在它当前没有运行时才重新初始化setInterval。我怎么能做到这一点?感谢您提供的任何提示和样品。如果可能的话,我想继续使用匿名函数。

2 个答案:

答案 0 :(得分:1)

分隔间隔功能

function intFunc(){
    if(new Date().getTime() - active.getTime() < 1000){
     console.log("sending active event to server.....");
             iter = 1;  
    else{
      iter++;
        if(iter >= 5){
           clearInterval(i);
        }
     }          
};

现在,在你需要的两个地方打电话给他们

var i;
$(window).on('mousemove', function(e){
  active = new Date;          
  i = setInterval(intFunc, 2000);

});
i = setInterval(intFunc, 2000);

答案 1 :(得分:0)

一种简单的方法就是删除clearInterval调用,而只是在iter < 5时轮询服务器。

但是这仍然有点浪费,因为处理程序在无操作时仍然被调用,当你希望你的笔记本电脑/手机处于省电模式时这很糟糕。所以我所做的基本上就是你所拥有的,但是在调用clearInterval之后,设置一个一次性的mousemove处理程序来重启轮询。

如果没有命名函数我就没有办法做到这一点(我假设你不想进入Y-combinators之类的东西),但你可以隐藏它的名字 - 以及其他的 - 来自通过围绕整个事物使用匿名函数来外部世界:

(function () {
    var i, active = new Date, iter = 1;

    $(window).on('mousemove', function(e) {
        active = new Date;
    });

    function startPolling() {
        i = setInterval(function() {
            if (new Date().getTime() - active.getTime() < 1000) {
                console.log("sending active event to server.....");
                iter = 1;
            }
            else{
                iter++;
                if (iter >= 5) {
                    clearInterval(i);
                    $(window).one('mousemove', function () {
                        startPolling();
                    });
                }
            }
        }, 2000);
    }

    startPolling();
})();