【问题标题】:Check if a timeout has been cleared?检查超时是否已清除?
【发布时间】:2011-03-07 23:27:16
【问题描述】:

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

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

当你清除它时,我认为 t 会像 undefined 一样。但它似乎有一些没有被清除的 id。

【问题讨论】:

标签: javascript


【解决方案1】:

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

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

【讨论】:

  • 很高兴看到在下面提到 Gavin 的回答。由于在清除时将 t 设置为 null 这是一个更简单的解决方案,可以很好地回答问题。
  • @NigelPeck:它更简单,但从设计的角度来看,包装对象几乎在所有其他方面都更好:封装、关注点分离、DRY...
【解决方案2】:

首先,我将这个答案的部分内容归功于 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 设置为 null。
  • @NigelPeck:我看不出这个答案“错过了回答问题的重点”。它为原始提问者的问题提供了极好的解决方案。
  • 确实如此,但由于只需将 t 变量设置为 null 即可回答原始问题,因此这是一个非常冗长的答案。这没有错,正如你所说,这是一个很好的解决方案,但前提是需要这种复杂性。由于错过了明显而简单的答案,因此没有抓住重点。我要说的是,这个问题的一个好的答案应该首先提到简单的解决方案,并明确说明这个包装对象解决方案作为替代方案。
  • 好吧,坦率地说,问题是“我可以确定超时是否已过期”,答案是“否”。从那时起,any 答案比该问题严格需要的答案更复杂。我不知道你为什么要区分对原始海报来说太复杂的东西和不复杂的东西......
【解决方案3】:

只需在超时函数中将t 设置为0

t = 0;

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

【讨论】:

  • 一个更明智的解决方案 Gavin。真的没有必要在这里使用包装器对象,而不建议在清除它时自己将超时设置为空。还有什么比这更简单的!
【解决方案4】:

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

仅供参考,最好传递对函数的直接引用,而不是将被评估的字符串。

var t=setTimeout(alertMsg,3000);

【讨论】:

    【解决方案5】:

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

    为此创建了一个小型测试页面: https://codepen.io/TheJesper/pen/rJzava

    【讨论】:

      【解决方案6】:

      还有另一种方法可以检查是否存在超时。默认情况下,保持超时的值具有随时间增加的数值。所以我们可以在“if”构造中进行下一步:

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

      【讨论】:

        猜你喜欢
        • 2011-09-04
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 2019-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多