我想知道有沒有辦法判斷超時仍設置檢查超時是否已被清除?
var t=setTimeout("alertMsg()",3000);
我認爲T公司將像不確定的,當你將其清除。但它似乎有一些沒有被清除的ID。
我想知道有沒有辦法判斷超時仍設置檢查超時是否已被清除?
var t=setTimeout("alertMsg()",3000);
我認爲T公司將像不確定的,當你將其清除。但它似乎有一些沒有被清除的ID。
不是直接的,但您可以創建一個包裝對象來提供該功能。一個粗略的實現是像這樣:
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
我的第一個想法是,以取代setTimeout
和clearTimeout
具有新功能(存儲在一個封閉的舊值)修改了他們的論點,但後來我意識到setTimeout
返回一個數字,這是一個原語(因此通過值傳遞)。我想如果我要開始返回非原始類型,那麼我可能只是創建一個包裝對象,這將允許更多的靈活性。但是,該方法可能與您想要的一樣 - 如果是這樣,如果您需要示例,則可以提供適當的代碼。
希望這會有所幫助。
很高興看到下面提到的Gavin的答案。由於將t清除時將t設置爲null是一個更簡單的解決方案,可以很好地回答問題。 – SuperDuperApps 2016-03-27 09:44:55
@NigelPeck:它更簡單一些,但從幾乎所有其他方式來看,包裝對象從設計角度來看都更好:封裝,關注點分離,DRY ... – Reid 2016-03-27 14:04:30
這真是天才! – 2016-07-06 22:24:52
否。要知道,您需要在致電clearTimeout
後清空t
變量。否則,真的沒有指標。
而且僅供參考,最好傳遞函數的直接引用而不是將被評估的字符串。
var t=setTimeout(alertMsg,3000);
首先,我在這個答案的部分內容中歸功於裏德,但是我覺得我應該添加一些建議。隨着我稍微補充裏德的代碼,這將:
那就是:
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]
我真的很喜歡這種方法,因爲它有多靈活。 +1 – Reid 2011-03-08 02:12:13
這個答案很有趣,但是在回答問題時忽略了一點,應該在前面提到這個問題......只需在清除超時和解決問題時將t設置爲null即可。 – SuperDuperApps 2016-03-27 09:46:44
@NigelPeck:我不明白這個答案「在回答問題時忽略了」。它爲原始提問者的問題提供了一個很好的解決方案。 – Reid 2016-03-27 14:05:45
還有另一種方法來檢查是否存在超時。保持超時的值默認爲隨着時間增加的數值。因此,我們可以做下一個「如果」的建設:
if (someBooleanValue && !parseInt(@changeToCriteriaTimeout) > 0){
//Do something
}
只需設置t
到0
(或你的情況T)在您的超時功能:
timeoutID = 0;
如果使用clearTimeout
它設置超時ID爲0,因此檢查timeoutID === 0
將檢查它是否已被清除或完成。
一個更合理的解決方案Gavin。真的沒有必要在這裏包裝對象,而沒有建議您在清除時自行清空超時。什麼可能更簡單! – SuperDuperApps 2016-03-27 09:44:10
像一些用戶建議在註釋,每當超時或者觸發(設定的時間已經過去之後)或者與clearTimeout
清零,手動設置到false
或優選null
。然後,您可以執行一個簡單的if-check來查看它是否處於活動狀態。如果需要,還請記住將其初始化爲false
/null
。
創建一個小的測試頁面這個: https://codepen.io/TheJesper/pen/rJzava
參見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