Javascript 检查是否已清除超时?

Javascript 检查是否已清除超时?,javascript,Javascript,我想知道有没有办法知道是否仍然设置了超时 var t=setTimeout("alertMsg()",3000); 我想当你清除它的时候,它就像是未定义的。但是它似乎有一些未被清除的id。否。为了知道,您需要在调用clearTimeout后将t变量设为空。否则就真的没有指标了 仅供参考,最好是直接向函数传递引用,而不是将要求值的字符串 var t=setTimeout(alertMsg,3000); 不是直接的,但是您可以创建一个包装器对象来提供该功能。粗略的实现是这样的: function

我想知道有没有办法知道是否仍然设置了超时

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

我想当你清除它的时候,它就像是未定义的。但是它似乎有一些未被清除的id。

否。为了知道,您需要在调用
clearTimeout
后将
t
变量设为空。否则就真的没有指标了

仅供参考,最好是直接向函数传递引用,而不是将要求值的字符串

var t=setTimeout(alertMsg,3000);

不是直接的,但是您可以创建一个包装器对象来提供该功能。粗略的实现是这样的:

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

首先,我对里德的部分回答表示赞赏,不过我觉得我应该补充一些建议。我对里德的代码稍加补充,这将:

  • 超时自然过期时自动清除
  • (可选)设置超时函数的范围(而不仅仅是在全局范围内执行)
  • 可选地将参数数组传递给超时函数
这是:

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]

还有另一种方法可以检查是否存在超时。保存超时的值的默认值是一个随时间增加的数值。所以我们可以在“如果”构造中做下一步:

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

只需在超时功能中将
t
设置为
0
(在您的情况下为t):

timeoutID = 0;

如果使用
clearTimeout
它会将超时id设置为0,因此检查
timeoutID==0
将检查它是否已被清除或已完成。

就像一些用户在评论中建议的那样,每当触发超时(在设置的时间过后)或用
clearTimeout
清除超时时,手动将其设置为
false
null
。然后,您可以执行一个简单的if检查,查看它是否处于活动状态。如果需要,还记得将其初始化为
false
/
null

为此创建了一个小测试页:

另请参见更合理的解决方案Gavin。实际上,这里不需要包装器对象,除非在清除超时时建议自己将其置零。还有什么比这更简单的呢!如果能在下面提到加文的答案,那就太好了。因为清除时将t设置为null,这是一个非常简单的解决方案,可以很好地回答这个问题。@NigelPeck:它更简单,但实际上从设计角度来看,包装器对象在其他方面都要好得多:封装、关注点分离、干燥……这个答案很有趣,但没有抓住回答这个问题的要点,这应该提前提到。。。在清除超时时间并解决问题时,只需将t设置为null即可。@NigelPeck:我不认为这个答案“没有抓住回答问题的重点”。它为原始的asker问题提供了一个很好的解决方案。确实如此,但是由于原始问题可以通过简单地将t变量设置为null来回答,因此这是一个非常详细的答案。这没什么错,正如你所说,这是一个很好的解决方案,但前提是需要这样的复杂性。由于没有找到明显而简单的答案,它就没有抓住要点。我想说的是,这个问题的一个好答案应该首先提到简单的解决方案,这个包装器对象解决方案作为替代方案被清楚地说明。好吧,坦率地说,问题是“我是否可以确定超时是否已过期”,答案是“否”。从这一点上讲,任何答案都比这个问题严格需要的答案更复杂。我不知道你为什么要区分对于原始海报来说太复杂的内容和不复杂的内容。。。