ClearInterval不清除SetInterval

时间:2013-03-14 15:36:45

标签: javascript clearinterval

当我们使用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。

4 个答案:

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