0

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

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。我怎样才能做到这一点?感谢您提供任何提示和示例。如果可能的话,我想继续使用匿名函数。

4

2 回答 2

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);
于 2012-04-29T16:31:45.507 回答
0

一种简单的方法是删除 clearInterval 调用,而仅在iter < 5.

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

我没有看到不命名函数的方法(我假设你不想进入 Y 组合器等),但你可以隐藏它的名字 - 以及其他 - 从外部世界通过在整个事情周围使用匿名函数:

(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();
})();
于 2012-04-29T17:03:01.703 回答