当我们使用SetInterval返回的值调用clearInterval时,它会使该值为null或未定义。
我调用clearInterval来清除setInterval但显然setInterval的值保持不变,即使在调用clearInterval之后也不会改变。被认为是null还是未定义?这是我的代码片段
var setIntervalId; // declared in global scope
//lined of code
function autorefresh() {
if (statesCount > 0) {
setIntervalId = setInterval(function() {
//lines of code
// calling some handler
}, 30000);
}
if (statesCount === 0) {
clearInterval(setIntervalId);
}
}
正如您所看到的,我每隔30秒调用一次setInterval函数,第一次调用时会为setIntervalId赋值,但即使在调用clearInterval之后,该值仍然存在。在调用clearInterval之后它应该变为null还是未定义?如果它应该为null或未定义我应该在这里做什么。我在全局范围内定义了setIntervalId。
答案 0 :(得分:5)
函数clearInterval
不会清除传递给它的值。如果你想清除它,你必须自己这样做
clearInterval(setIntervalId);
setIntervalId = undefined;
请注意,您似乎没有正确保护对setInterval
的初始调用。这可能导致多次调用,因此您有多个间隔设置。我认为你应该将你的初始if
块增加到以下
if (statesCount > 0 && typeof(setIntervalId) === 'undefined') {
...
}
答案 1 :(得分:3)
调用clearInterval后它应该变为null还是未定义?
没有
这只是一个数字。当间隔被清除时,该数字只是历史的好奇心。
如果您愿意,可以在undefined
使用后clearInterval
明确指定{{1}}。除非您使用它来跟踪您的功能当前是否定期运行,否则无需执行此操作。
答案 2 :(得分:1)
好吧,我经历了同样的问题太多次了,通常我会顺其自然, 但是大多数时候,我意识到清除间隔后间隔会继续运行,这可能会影响设备的性能(就像有一个无限循环)。
所以我做了一些研究,发现了问题所在,然后编写了简单的代码来解决它。
现在,在大多数情况下,当您启动一个间隔(很可能是由事件触发)时,就会声明该间隔的多个实例(无论出于何种原因)...
因此,当您以后清除间隔时,仅清除* top-level间隔,然后设置下一个级别间隔。 (顶层可能不是正确的单词)
为了真正清除间隔,我使用了以下方法:
设置时间间隔:
if(!timer)
timer =setInterval(myFunction, 1000);
清除间隔:
clearInterval(timer);
timer=null;
while (timer!== null){
timer=null;
}
您可能决定清除while循环内的时间间隔,但是我发现这对我有用,并且比之有效。
确保检查间隔变量的范围(在上述情况下为计时器)
答案 3 :(得分:0)
如果您允许多个间隔,则需要保持对每个实例的访问权限才能阻止它们。
var setIntervalId; // declared in global scope
var statesCount = 1; // simulate active state
//lined of code
function autorefresh() {
if (statesCount > 0) {
console.log('started');
setIntervalId = setInterval(function() {
// just to see whats happening in console
console.log(statesCount);
// performe interval checks inside the interval loop not outside if you want to stop it automaticaly
if (statesCount === 0) {
clearInterval(setIntervalId);
}
// lines of code
// calling some handler
}, 1000); // repeat every 1s
};
}
// run interval
autorefresh();
// stimulate change of stateCount after 5s
// setTimeout(function(){
// statesCount = 1;
// },5000);
// clear interval after 10s
setTimeout(function(){
clearInterval(setIntervalId);
console.log('stoped');
},10000);