2010-04-20 151 views
35

举例来说,我设置像有没有办法检查一个var是否使用setInterval()?

timer = setInterval(fncName, 1000); 

的间隔,如果我去,做

clearInterval(timer); 

它明确的时间间隔,但有什么办法,以检查它清除的时间间隔?我尝试了解它的价值,但它有一个时间间隔,而当它没有,但他们都似乎是数字。

+1

它确实工作(清除它) - 所以我不知道为什么你需要检查它? – scunliffe 2010-04-20 22:28:48

+2

id只是想知道在任何特定时间是否有间隔等待。 – chadley 2010-04-20 22:32:45

回答

83

没有直接的方法去做你正在寻找的东西。相反,你可以每次调用clearInterval时间设置timer为false:

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

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

现在,timer要么是假的,或者在给定的时间值,这样你就可以简单地用

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

这是我计划要做的,如果没有人回答我的问题。我写了类似的东西: var stopInterval = function(varname)clearInterval(); varname = false; } var isRunning = function(varname){ return !!VARNAME; }' 我知道这完全不会工作,因为varname可能会是一个字符串,从而使其始终如此,但它的想法适用于我。你的方式也会起作用,但是人们要小心,setInterval()给出了一个数值,如果它可以以1或0表示t/f。 – chadley 2010-04-20 22:55:36

+1

嗯,我想格式不工作评论...我的坏。有没有人知道如何在评论中设置代码的格式,还是完全不允许? – chadley 2010-04-20 23:01:35

+3

使用'if(timer!== false)'来避免数字问题。 (计数等号) – yankee 2011-02-07 17:26:37

5

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

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

+0

谢谢您的确认 – chadley 2010-04-20 22:58:01

1

你可以重写setInterval方法并添加跟踪你的间隔。这是概述这个想法的一个非常典型的例子。它仅适用于当前窗口(如果您有多个窗口,可以在原型对象的帮助下更改此窗口),并且只有在您关注的任何功能都已注册之前覆盖功能时,此功能才有效:

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

此问题的解决方案:创建一个全局计数器,该计数器在由setInterval执行的代码内增加。然后在调用setInterval之前,测试计数器是否仍在增量。如果是这样,你的setInterval仍然是活动的。如果没有,你很好走。

-1

很多复杂答案的上方,这种方法工作得很好,我:

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

我正在卷动所有这些复杂的答案,思考完全相同的事情。我即将发布你在这里的相同答案。不需要过分复杂的东西,人! – 2013-09-11 20:55:43

+4

这是不正确的。至少不是在较新版本的Chrome中。我知道这是旧的,但认为我会发布。 var test = setInterval(function(){console.log('ran');});','typeof test //返回“number”','clearInterval(test);','typeof test // returns“号“'。这表明该变量在清除时未设置为未定义。 – PJH 2014-02-14 13:22:47

+0

没问题,所以只要确保它在timer = clearInterval(test)清除定时器时设置为undefined; – shazbot 2014-02-26 14:12:17

1

我这样做类似下面,我的问题得到解决。当你清除计时器时,你应该设置值为“假”。

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

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

简单的解决方案 - 完美的作品。 – Syno 2017-12-11 10:03:59

相关问题