我想知道是否有一种方法来判断是否仍然设置超时
var t=setTimeout("alertMsg()",3000);
我以为当你清除它的时候,它会像undefined一样。但是它似乎有一些id没有被清除。
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
mwecs4sa2#
首先,我对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; };
5cg8jx4n3#
只需在timeout函数中将t设置为0:
t
0
t = 0;
如果使用clearTimeout,它会将超时id设置为0,因此检查t === 0将检查它是否已被清除或完成。
clearTimeout
t === 0
6ioyuze24#
不可以。为了知道,你需要在调用clearTimeout后将t变量置空。否则就没有指示器了。仅供参考,最好传递一个直接引用到函数,而不是一个将被eval'd的字符串。
var t=setTimeout(alertMsg,3000);
gg58donl5#
就像一些用户在评论中建议的那样,每当超时被触发(在设置的时间过去之后)或使用clearTimeout清除时,手动将其设置为false或最好是null。然后您可以执行简单的if检查以查看它是否处于活动状态。如果需要,请记住将其初始化为false/null。为此创建了一个小测试页面:https://codepen.io/TheJesper/pen/rJzava
false
null
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 }
monwx1rj7#
还有另一种方法来检查超时的存在。保存超时的值默认为一个随时间增加的数字值。所以我们可以在“if”构造中执行下一个:
if (someBooleanValue && !parseInt(@changeToCriteriaTimeout) > 0){ //Do something }
7条答案
按热度按时间w1jd8yoj1#
不是直接的,但是你可以创建一个 Package 器对象来给予这个功能。一个粗略的实现是这样的:
然后你可以这样做:
mwecs4sa2#
首先,我对Reid的部分回答表示感谢,但是我觉得我应该添加一些建议。通过对Reid代码的轻微添加,这将:
这是:
5cg8jx4n3#
只需在timeout函数中将
t
设置为0
:如果使用
clearTimeout
,它会将超时id设置为0,因此检查t === 0
将检查它是否已被清除或完成。6ioyuze24#
不可以。为了知道,你需要在调用
clearTimeout
后将t
变量置空。否则就没有指示器了。仅供参考,最好传递一个直接引用到函数,而不是一个将被eval'd的字符串。
gg58donl5#
就像一些用户在评论中建议的那样,每当超时被触发(在设置的时间过去之后)或使用
clearTimeout
清除时,手动将其设置为false
或最好是null
。然后您可以执行简单的if检查以查看它是否处于活动状态。如果需要,请记住将其初始化为false
/null
。为此创建了一个小测试页面:https://codepen.io/TheJesper/pen/rJzava
wvt8vs2t6#
这仅与node.js相关:setTimeout返回一个对象,该对象具有_destroyed属性
注意:如果事件已触发,则_destroyed也为true
monwx1rj7#
还有另一种方法来检查超时的存在。保存超时的值默认为一个随时间增加的数字值。所以我们可以在“if”构造中执行下一个: