3

当我们使用 SetInterval 返回的值调用 clearInterval 时,它会使该值变为 null 还是未定义。

我正在调用 clearInterval 来清除 setInterval 但显然 setInterval 的值保持不变,即使在调用 clearInterval 之后也不会改变。t 应该是 null 还是 undefined ?这是我的代码片段

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 还是 undefined?如果它应该为 null 或 undefined 我应该在这里做什么。我已经在全局范围内定义了 setIntervalId。

4

4 回答 4

8

该函数clearInterval不会清除传递给它的值。如果你想清除它,你必须自己做

clearInterval(setIntervalId);
setIntervalId = undefined;

请注意,您似乎没有正确保护对setInterval. 这可能会导致多次调用,因此您有多个间隔设置。我认为您应该将初始if块增加到以下内容

if (statesCount > 0 && typeof(setIntervalId) === 'undefined') { 
  ...
}
于 2013-03-14T15:38:13.113 回答
7

调用 clearInterval 后它应该变为 null 还是 undefined?

不。

这只是一个数字。当间隔被清除后,这个数字只是一个历史奇闻。

如果您愿意,可以在使用后显式分配undefined给它clearInterval。除非您使用它来跟踪您的函数当前是否正在定期运行,否则无需执行此操作。

于 2013-03-14T15:38:29.723 回答
3

好的,我遇到同样的问题太多次了,通常我只是顺其自然,但大多数时候我意识到在清除间隔后间隔继续运行,这可能会影响设备的性能(就像有一个无限循环)。

所以我做了一些研究,发现了问题所在,我写了一个简单的代码来解决它。

现在,在大多数情况下,当您开始一个间隔(很可能由事件触发)时,会声明该间隔的多个实例(无论出于何种原因)......

所以以后清除区间时,只清除*top-level区间,下一级区间设置。(top-level可能不是正确的词)

因此,为了真正清除间隔,我使用了以下方法:

设置间隔:

if(!timer)   
    timer =setInterval(myFunction, 1000);

清除间隔:

clearInterval(timer);
timer=null;
while (timer!== null){
    timer=null;
}

您可能决定清除 while 循环内的时间间隔,但我发现这对我有用,而且比这更有效。

确保检查间隔变量的范围(即上述情况下的计时器)

于 2020-06-19T07:27:32.553 回答
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);
于 2017-01-16T04:17:01.173 回答