有没有办法检查var是否正在使用setInterval()?

时间:2010-04-20 22:26:07

标签: javascript

例如,我正在设置一个像

这样的间隔
timer = setInterval(fncName, 1000);

如果我去做

clearInterval(timer);

它确实清除了间隔,但有没有办法检查它是否清除了间隔?我已经尝试在它有间隔的情况下得到它的值,当它没有时,但它们似乎都只是数字。

7 个答案:

答案 0 :(得分:102)

没有直接的方法来做你想要的。相反,您每次拨打timer时都可以将clearInterval设置为false:

// Start timer
var timer = setInterval(fncName, 1000);

// End timer
clearInterval(timer);
timer = false;

现在,timer将为false或在给定时间具有值,因此您只需检查

if (timer)
    ...

如果你想把它封装在一个类中:

function Interval(fn, time) {
    var timer = false;
    this.start = function () {
        if (!this.isRunning())
            timer = setInterval(fn, time);
    };
    this.stop = function () {
        clearInterval(timer);
        timer = false;
    };
    this.isRunning = function () {
        return timer !== false;
    };
}

var i = new Interval(fncName, 1000);
i.start();

if (i.isRunning())
    // ...

i.stop();

答案 1 :(得分:6)

setTimeoutsetInterval的返回值是完全不透明的值。你无法从中得出任何意义;它们的唯一用途是传回clearTimeoutclearInterval

没有功能可以测试一个值是否对应于活动的超时/间隔,对不起!如果你想要一个可以检查其状态的计时器,你必须创建自己的包装器函数,记住设置/清除状态是什么。

答案 2 :(得分:1)

您可以覆盖setInterval方法并添加跟踪间隔的功能。这是一个概述这个想法的不可测试的例子。它只能在当前窗口中工作(如果你有多个,可以在原型对象的帮助下更改它),这只有在你注意跟踪的任何函数被覆盖之前覆盖函数时才会起作用: / p>

var oldSetInterval = window.setInterval;
var oldClearInterval = window.clearInterval;
window.setInterval = function(func, time)
{
  var id = oldSetInterval(func, time);
  window.intervals.push(id);
  return id;
}
window.intervals = [];
window.clearInterval = function(id)
{
  for(int i = 0; i < window.setInterval.intervals; ++i)
    if (window.setInterval.intervals[i] == id)
    {
      window.setInterval.intervals.splice(i, 1);
    }
  oldClearInterval(id);
}
window.isIntervalRegistered(id)
{
  for(int i = 0; i < window.setInterval.intervals; ++i)
    if (window.setInterval.intervals[i] == func)
      return true;
  return false;
}



var i = 0;
var refreshLoop = setInterval(function(){
    i++;
}, 250);

if (isIntervalRegistered(refrshLoop)) alert('still registered');
else alert('not registered');
clearInterval(refreshLoop);
if (isIntervalRegistered(refrshLoop)) alert('still registered');
else alert('not registered');

答案 3 :(得分:1)

此问题的解决方案:创建一个全局计数器,该计数器在setInterval执行的代码中递增。然后在调用setInterval之前,测试计数器是否仍然是STILL递增。如果是这样,您的setInterval仍处于活动状态。如果没有,你很高兴。

答案 4 :(得分:1)

我这样做了,我的问题解决了。当你清除计时器时,你应该设置像&#34; false&#34;这样的值。

var timeer=false;
----
----
if(timeer==false)
{
  starttimer();  
}
-----
-----
function starttimer()
{
  timeer=setInterval(activefunction, 1000); 
}

function pausetimer()
{
  clearTimeout(timeer);
  timeer=false;
}

答案 5 :(得分:0)

好吧

var interval = setInterval(function() {}, 1000);
interval = clearInterval(interval);
if (typeof interval === 'undefined'){
...
}

但是您实际上想做什么? clearInterval函数是一个始终成功的函数,即使您使用NaN值调用它,也始终会返回undefined,并且在那里没有错误检查。

答案 6 :(得分:-1)

上面有很多复杂的答案,这种方法对我来说很合适:

if (typeof timer == 'undefined')
{
    //timer has been cleared
}