检查是否已清除超时?

时间:2011-03-07 23:27:17

标签: javascript

我想知道是否有办法判断是否仍然设置超时

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

当你清除它时,我认为是不确定的。但它似乎有一些不被清除的id。

6 个答案:

答案 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

我的第一个想法是将setTimeoutclearTimeout替换为修改其参数的新函数(将其旧值存储在闭包中),但后来我意识到setTimeout返回一个数字,这是一个原语(因此通过值传递)。我想如果我要开始返回非基元,我不妨只做一个包装器对象,这将允许更多的灵活性。但是,这种方法可能就像你想要的那样 - 如果是这样的话,如果你需要一个例子,我可以提供适当的代码。

希望这有帮助。

答案 1 :(得分:20)

首先,我对Reid的部分回答表示赞赏,但我觉得我应该加上一些建议。随着我对Reid代码的轻微补充,这将:

  • 超时自然到期时自动清除
  • 可选择设置超时功能的范围(而不仅仅是在全局范围内执行)。
  • 可选地将arguments数组传递给超时函数

这里是:

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
}