2010-04-20 114 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

相關問題