javascript 检查是否已清除超时?

wbgh16ku  于 2023-04-19  发布在  Java
关注(0)|答案(7)|浏览(131)

我想知道是否有一种方法来判断是否仍然设置超时

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

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

w1jd8yoj

w1jd8yoj1#

不是直接的,但是你可以创建一个 Package 器对象来给予这个功能。一个粗略的实现是这样的:

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
mwecs4sa

mwecs4sa2#

首先,我对Reid的部分回答表示感谢,但是我觉得我应该添加一些建议。通过对Reid代码的轻微添加,这将:

  • 超时自然到期时自动清除
  • 可选地设置timeout函数的作用域(而不是仅在全局作用域中执行)。
  • 可选地将参数数组传递给超时函数

这是:

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;
};
  • [开始comment-free plug]* 哦,我正在使用向类添加方法的原型模型,但只是因为我喜欢它,而不是因为我觉得它更正确 [end comment-free plug]
5cg8jx4n

5cg8jx4n3#

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

t = 0;

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

6ioyuze2

6ioyuze24#

不可以。为了知道,你需要在调用clearTimeout后将t变量置空。否则就没有指示器了。
仅供参考,最好传递一个直接引用到函数,而不是一个将被eval'd的字符串。

var t=setTimeout(alertMsg,3000);
gg58donl

gg58donl5#

就像一些用户在评论中建议的那样,每当超时被触发(在设置的时间过去之后)或使用clearTimeout清除时,手动将其设置为false或最好是null。然后您可以执行简单的if检查以查看它是否处于活动状态。如果需要,请记住将其初始化为false/null
为此创建了一个小测试页面:https://codepen.io/TheJesper/pen/rJzava

wvt8vs2t

wvt8vs2t6#

这仅与node.js相关:setTimeout返回一个对象,该对象具有_destroyed属性

Welcome to Node.js v18.12.1.
Type ".help" for more information.
> let x = setTimeout(function(){},60000)
undefined
> x
Timeout {
  _idleTimeout: 60000,
  _idlePrev: [TimersList],
  _idleNext: [TimersList],
  _idleStart: 2170,
  _onTimeout: [Function (anonymous)],
  _timerArgs: undefined,
  _repeat: null,
  _destroyed: false,
  [Symbol(refed)]: true,
  [Symbol(kHasPrimitive)]: false,
  [Symbol(asyncId)]: 27,
  [Symbol(triggerId)]: 5
}
> x._destroyed
false
> clearTimeout(x)
undefined
> x._destroyed
true
>

注意:如果事件已触发,则_destroyed也为true

> let y = setTimeout(function(){console.log("yay");},10)
undefined
> yay
> y
Timeout {
  _idleTimeout: 10,
  _idlePrev: null,
  _idleNext: null,
  _idleStart: 198348,
  _onTimeout: [Function (anonymous)],
  _timerArgs: undefined,
  _repeat: null,
  _destroyed: true,
  [Symbol(refed)]: true,
  [Symbol(kHasPrimitive)]: false,
  [Symbol(asyncId)]: 508,
  [Symbol(triggerId)]: 5
}
monwx1rj

monwx1rj7#

还有另一种方法来检查超时的存在。保存超时的值默认为一个随时间增加的数字值。所以我们可以在“if”构造中执行下一个:

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

相关问题