我可以看看计时器是否仍在运行吗?

时间:2010-07-14 14:32:48

标签: javascript settimeout

这里简单的问题我似乎无法找到答案:一旦设置了setTimeout,有没有办法看看它是否仍然,好吧,设置?

if (!Timer)
{
    Timer = setTimeout(DoThis,60000);
}

据我所知,当你clearTimeout时,变量保持在最后一个值。 console.log我只是将Timer显示为'12',无论是否已设置或清除超时。我是否也必须将变量置零,或者使用其他变量作为布尔说法,是的,我已设置此计时器?当然有一种方法可以检查超时是否仍在运行......对吗?我不需要知道剩下多长时间,只要它还在运行。

6 个答案:

答案 0 :(得分:50)

我的工作是:

var timer = null;

if (timer != null) {
  window.clearTimeout(timer); 
  timer = null;
}
else {
  timer = window.setTimeout(yourFunction, 0);
}

答案 1 :(得分:47)

除了启动或停止计时器之外,无论如何都无法与计时器进行交互。我通常在超时处理程序中清空timer变量,而不是使用标志来指示计时器未运行。有关计时器如何工作的W3Schools有一个很好的描述。在他们的例子中,他们使用标志变量。

您看到的值是当前计时器的handle,当您清除(停止)它时使用它。

答案 2 :(得分:4)

使用您的计时器设置另一个变量Timer_Started = true。并且在调用计时器函数时将变量更改为false

// set 'Timer_Started' when you setTimeout
var Timer_Started = true;
var Timer = setTimeout(DoThis,60000);

function DoThis(){

   // function DoThis actions 
   //note that timer is done.
   Timer_Started = false;

}

function Check_If_My_Timer_Is_Done(){

   if(Timer_Started){
      alert("The timer must still be running.");
   }else{
      alert("The timer is DONE.");
   }

}

答案 3 :(得分:4)

在启动计时器之前,无需检查现有计时器,只需检查clearTimout。

var timer;
var startTimer = function() {
  clearTimout(timer);
  timer = setTimeout(DoThis, 6000);
}

这将在开始新实例之前清除任何计时器。

答案 4 :(得分:1)

我知道这是一个necroposting但我认为仍然有人在寻找这个。

这是我使用的: 3个变量:

  1. t,因为..在日期对象中为下一个目标
  2. 而持续了几毫秒 实际间隔
  3. timerSys
  4. 已设置
  5. seconds毫秒阈值
  6. 接下来我有一个带有1个变量的function timer,该函数检查变量是否为真正的,如果是,他检查计时器是否已经在运行,如果是这样,则填充 global vars ,如果不是真正的 falsely ,则清除间隔并将global var timerSys设置为 false ;

    var t, timerSys, seconds;
    
    function timer(s) {
      if (s && typeof s === "number") {
        if (typeof timerSys === "boolean" || typeof timerSys === "undefined") {
          timerSys = setInterval(function() {
            sys();
          }, s);
          t = new Date().setMilliseconds(s);
          seconds = s;
        }
      } else {
        clearInterval(timerSys);
        timerSys = false;
      }
      return ((!timerSys) ? "0" : t)
    }
    
    function sys() {
      t = new Date().setMilliseconds(seconds);
    
    }
    

    示例I

    现在您可以在 sys function 中添加一行:

    function sys() {
      t = new Date().setMilliseconds(seconds);
      console.log("Next execution: " + new Date(t));
    //this is also the place where you put functions & code needed to happen when interval is triggerd
    
    }
    

    执行:

      timer(5000);
    

    在控制台中每隔5秒:

      //output:: Next execution: Sun May 08 2016 11:01:05 GMT+0200 (Romance (zomertijd))
    

    示例II

    function sys() {
      t = new Date().setMilliseconds(seconds);
      console.log("Next execution: " + seconds/1000 + " seconds");
    
    }
    
    $(function() {
      timer(5000);
    });
    

    在控制台中每隔5秒:

          //output:: Next execution: 5 seconds
    

    示例III

    var t, timerSys, seconds;
    
    function timer(s) {
      if (s && typeof s === "number") {
        if (typeof timerSys === "boolean" || typeof timerSys === "undefined") {
          timerSys = setInterval(function() {
            sys();
          }, s);
          t = new Date().setMilliseconds(s);
          seconds = s;
        }
      } else {
        clearInterval(timerSys);
        timerSys = false;
      }
      return ((!timerSys) ? "0" : t)
    }
    
    function sys() {
      t = new Date().setMilliseconds(seconds);
      console.log("Next execution: " + seconds / 1000 + " seconds");
    
    }
    
    $(function() {
      timer(5000);
    
      $("button").on("click", function() {
        $("span").text(t - new Date());
      })
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <button>Freebeer</button>
    <span></span>

    请注意,您可以低于0

答案 5 :(得分:1)

我通常会使计时器无效:

var alarm = setTimeout(wakeUpOneHourLater, 3600000);
function wakeUpOneHourLater() {
    alarm = null;    //stop alarm after sleeping for exactly one hour
}
//...
if (!alarm) {
    console.log('Oops, waked up too early...Zzz...');
}
else {
    console.log('Slept for at least one hour!');
}