我想知道是否有办法判断是否仍然设置超时
var t=setTimeout("alertMsg()",3000);
当你清除它时,我认为是不确定的。但它似乎有一些不被清除的id。
答案 0 :(得分:42)
不是直接的,但您可以创建一个包装器对象来提供该功能。粗略的实现是这样的:
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
返回一个数字,这是一个原语(因此通过值传递)。我想如果我要开始返回非基元,我不妨只做一个包装器对象,这将允许更多的灵活性。但是,这种方法可能就像你想要的那样 - 如果是这样的话,如果你需要一个例子,我可以提供适当的代码。
希望这有帮助。
答案 1 :(得分:20)
首先,我对Reid的部分回答表示赞赏,但我觉得我应该加上一些建议。随着我对Reid代码的轻微补充,这将:
这里是:
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;
};
[开始免费评论插件] 哦,我正在使用为类添加方法的原型模型,但仅仅因为我更喜欢它,而不是因为我觉得它更正确 [免费评论插件]
答案 2 :(得分:8)
在超时功能中将t
设置为0
(或在你的情况下为t):
timeoutID = 0;
如果你使用clearTimeout
,它会将超时ID设置为0,因此检查timeoutID === 0
将检查它是否已被清除或完成。
答案 3 :(得分:4)
没有。要知道,在调用t
后,您需要使clearTimeout
变量为空。否则就没有指标。
而且仅供参考,最好是直接引用该函数而不是将被评估的字符串。
var t=setTimeout(alertMsg,3000);
答案 4 :(得分:0)
与某些用户在评论中建议的情况一样,无论何时触发超时(在设定时间过后)或用clearTimeout
清除超时,请手动将其设置为false
或最好null
。然后,您可以执行简单的if检查以查看它是否处于活动状态。如果需要,请记住将其初始化为false
/ null
。
为此创建了一个小测试页: https://codepen.io/TheJesper/pen/rJzava
答案 5 :(得分:-3)
还有另一种方法可以检查是否存在超时。保持超时的值默认为数值,该值随时间增加。所以我们可以在“if”构造中做下一步:
if (someBooleanValue && !parseInt(@changeToCriteriaTimeout) > 0){
//Do something
}