【发布时间】:2011-03-07 23:27:16
【问题描述】:
我想知道有没有办法判断是否仍然设置了超时
var t=setTimeout("alertMsg()",3000);
当你清除它时,我认为 t 会像 undefined 一样。但它似乎有一些没有被清除的 id。
【问题讨论】:
标签: javascript
我想知道有没有办法判断是否仍然设置了超时
var t=setTimeout("alertMsg()",3000);
当你清除它时,我认为 t 会像 undefined 一样。但它似乎有一些没有被清除的 id。
【问题讨论】:
标签: javascript
不是直接的,但您可以创建一个包装器对象来提供该功能。粗略的实现是这样的:
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
【讨论】:
首先,我将这个答案的部分内容归功于 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;
};
[开始免评论插件] 哦,而且我用的是给类加方法的原型模型,不过只是因为我比较喜欢,并不是因为我觉得它更正确 [结束无评论插件]
【讨论】:
只需在超时函数中将t 设置为0:
t = 0;
如果您使用clearTimeout,它会将超时ID 设置为0,因此检查t === 0 将检查它是否已被清除或完成。
【讨论】:
没有。为了知道,您需要在调用clearTimeout 后将t 变量设为空。否则真的没有指标。
仅供参考,最好传递对函数的直接引用,而不是将被评估的字符串。
var t=setTimeout(alertMsg,3000);
【讨论】:
就像一些用户在 cmets 中建议的那样,每当超时被触发(在设置的时间过去之后)或用clearTimeout 清除时,手动将其设置为false 或者最好是null。然后您可以执行一个简单的 if-check 以查看它是否处于活动状态。如果需要,还记得将其初始化为false/null。
为此创建了一个小型测试页面: https://codepen.io/TheJesper/pen/rJzava
【讨论】:
还有另一种方法可以检查是否存在超时。默认情况下,保持超时的值具有随时间增加的数值。所以我们可以在“if”构造中进行下一步:
if (someBooleanValue && !parseInt(@changeToCriteriaTimeout) > 0){
//Do something
}
【讨论】: