2011-03-07 182 views
30

我想知道有沒有辦法判斷超時仍設置檢查超時是否已被清除?

var t=setTimeout("alertMsg()",3000); 

我認爲T公司將像不確定的,當你將其清除。但它似乎有一些沒有被清除的ID。

+0

參見http://stackoverflow.com/questions/4021374/how-to-know-if-a-timer-is-cleared-or-timed -out-in-javascript – goodeye 2013-06-24 00:57:04

回答

31

不是直接的,但您可以創建一個包裝對象來提供該功能。一個粗略的實現是像這樣:

function Timeout(fn, interval) { 
    var id = setTimeout(fn, interval); 
    this.cleared = false; 
    this.clear = function() { 
     this.cleared = true; 
     clearTimeout(id); 
    }; 
} 

然後,你可以這樣做:

var t = new Timeout(function() { 
    alert('this is a test'); 
}, 5000); 
console.log(t.cleared); // false 
t.clear(); 
console.log(t.cleared); // true 

我的第一個想法是,以取代setTimeoutclearTimeout具有新功能(存儲在一個封閉的舊值)修改了他們的論點,但後來我意識到setTimeout返回一個數字,這是一個原語(因此通過值傳遞)。我想如果我要開始返回非原始類型,那麼我可能只是創建一個包裝對象,這將允許更多的靈活性。但是,該方法可能與您想要的一樣 - 如果是這樣,如果您需要示例,則可以提供適當的代碼。

希望這會有所幫助。

+0

很高興看到下面提到的Gavin的答案。由於將t清除時將t設置爲null是一個更簡單的解決方案,可以很好地回答問題。 – SuperDuperApps 2016-03-27 09:44:55

+0

@NigelPeck:它更簡單一些,但從幾乎所有其他方式來看,包裝對象從設計角度來看都更好:封裝,關注點分離,DRY ... – Reid 2016-03-27 14:04:30

+0

這真是天才! – 2016-07-06 22:24:52

4

否。要知道,您需要在致電clearTimeout後清空t變量。否則,真的沒有指標。

而且僅供參考,最好傳遞函數的直接引用而不是將被評估的字符串。

var t=setTimeout(alertMsg,3000); 
20

首先,我在這個答案的部分內容中歸功於裏德,但是我覺得我應該添加一些建議。隨着我稍微補充裏德的代碼,這將:

  • 自動清零當超時到期自然
  • 選擇設置超時功能(而不僅僅是在全球範圍內執行)的範圍。
  • 選擇將參數數組超時功能

那就是:

function Timeout(fn, interval, scope, args) { 
    scope = scope || window; 
    var self = this; 
    var wrap = function(){ 
     self.clear(); 
     fn.apply(scope, args || arguments); 
    } 
    this.id = setTimeout(wrap, interval); 
} 
Timeout.prototype.id = null 
Timeout.prototype.cleared = false; 
Timeout.prototype.clear = function() { 
    clearTimeout(this.id); 
    this.cleared = true; 
    this.id = null; 
}; 

[開始自由評論插頭] 哦,我使用的添加方法原型模型到類,但只是因爲我更喜歡它,並不是因爲我覺得它更正確 [end comment-free plug]

+0

我真的很喜歡這種方法,因爲它有多靈活。 +1 – Reid 2011-03-08 02:12:13

+0

這個答案很有趣,但是在回答問題時忽略了一點,應該在前面提到這個問題......只需在清除超時和解決問題時將t設置爲null即可。 – SuperDuperApps 2016-03-27 09:46:44

+0

@NigelPeck:我不明白這個答案「在回答問題時忽略了」。它爲原始提問者的問題提供了一個很好的解決方案。 – Reid 2016-03-27 14:05:45

-2

還有另一種方法來檢查是否存在超時。保持超時的值默認爲隨着時間增加的數值。因此,我們可以做下一個「如果」的建設:

if (someBooleanValue && !parseInt(@changeToCriteriaTimeout) > 0){ 
    //Do something 
} 
5

只需設置t0(或你的情況T)在您的超時功能:

timeoutID = 0; 

如果使用clearTimeout它設置超時ID爲0,因此檢查timeoutID === 0將檢查它是否已被清除或完成。

+0

一個更合理的解決方案Gavin。真的沒有必要在這裏包裝對象,而沒有建議您在清除時自行清空超時。什麼可能更簡單! – SuperDuperApps 2016-03-27 09:44:10

0

像一些用戶建議在註釋,每當超時或者觸發(設定的時間已經過去之後)或者與clearTimeout清零,手動設置到false或優選null。然後,您可以執行一個簡單的if-check來查看它是否處於活動狀態。如果需要,還請記住將其初始化爲false/null

創建一個小的測試頁面這個: https://codepen.io/TheJesper/pen/rJzava