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


77

这里的一个简单问题似乎无法找到答案:setTimeout设置a之后,是否有任何方法可以查看它是否仍然设置好?

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

据我所知,当您使用时clearTimeout,变量将保持其最后一个值。一个console.log我只是看着显示Timer为“12”,不管是否设置了超时或清零。我是否还必须使变量为空,或者使用其他变量作为布尔值,是的,我已经设置了此计时器?当然有一种方法可以检查超时是否仍在运行...对吗?我不需要知道还剩下多久,即使它仍在运行。

Answers:


54

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

您看到的值是当前计时器的句柄,当您清除(停止)该计时器时将使用该值。


9
-1 patrick,这不是世俗的原则。有时他们有有用的资源。

5
OT:问题在于将那些时间与其他时间区分开了:)当然,在不知道主题的情况下
superjos 2012年

“我通常将超时中的计时器变量
设为

64

我要做的是:

var timer = null;

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

2
使用setTimeout(yourFunction, 0),比setTimeout('yourFunction()', 0)
cprcrack 2014年

1
@Epirocks即使在异步世界中,JavaScript仍然是单线程的。
matpop

我只是想指出,如果有一种方法可以询问计时器是否仍在运行,那将是很好的。当时我的页面上充满了异步请求,并且发现此解决方案有点过于简化了,但是我想不起来要详细介绍。
Epirocks

你为什么要清除并为空?也clearTimeout不能保证它没有被占用的内存?干杯。(对不起,我知道这是从很久以前开始的)
1252748年

2
@ 1252748,timer即使window.clearTimeout调用该变量,该变量仍保持其值(计时器ID)。因此有必要将其重置。
Benny Neugebauer

16

无需检查现有的计时器,只需clearTimeout在启动计时器之前执行即可。

var timer;
//..
var startTimer = function() {
  clearTimeout(timer);
  timer = setTimeout(DoThis, 6000);
}

这将在启动新实例之前清除所有计时器。


工作正常,完全符合我的要求。谢谢。这个答案值得更多推荐。
斯特凡·洛朗

5

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.");
   }

}

2

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

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

  1. t 自日期对象中下一个目标以来的毫秒数。
  2. timerSys 对于实际间隔
  3. seconds 已设置毫秒阈值

接下来我有一个function timer带有1个变量的函数,该函数检查变量是否是真的,如果是的话,他检查计时器是否已经在运行,如果是的话 ,则填充全局变量,如果不是真的错误地,清除间隔并设置global var timerSysfalse ;

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);

}

例一

现在,您可以向sys函数添加一行:

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))

例二

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


2

我通常使计时器无效:

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!');
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.