【问题标题】:How can I resume setInterval after clearInterval has been called in javascript?在javascript中调用clearInterval后如何恢复setInterval?
【发布时间】:2026-02-09 18:00:02
【问题描述】:

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

【问题讨论】:

    标签: javascript setinterval anonymous-methods


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

      一种简单的方法是删除 clearInterval 调用,而仅在 iter &lt; 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();
      })();
      

      【讨论】: