在闭包内的SetInterval,在For循环内,创建太多间隔,不会停止运行

时间:2014-01-19 02:22:27

标签: javascript arrays for-loop closures

我有一些相当复杂的逻辑:

var myArray = [];
var tempInterval = 0;

// Run for 6 minutes
for(i=0;i<360;i++) {

  // Closure so that 'i' is the right value when setInterval runs
  tempInterval = (function(i) {

      interval1 = setInterval(function() {
          console.log(i);
      }, (i * 1000));

      return interval1; 

  })(i);

  // Put the setInterval value into an array
  myArray.push(tempInterval);
}

我使用Closure因为我需要i的值为0,1,2,...etc,如果你不使用闭包,那么在间隔时间它将是360执行。

如果你在控制台中运行它,你会看到它的运行方式超过360次。出于某种原因,它创造了太多的间隔。

我想要一个函数来停止setIntervals的执行:

for(i=0; i<myArray.length; i++) {
    clearInterval(myArray[i]);
}

但是,因为它创造了太多,我无法阻止它。

例如,如果您在for(i=0; i<5; i++)而不是for(i=0;i<360;i++)内运行它,您会看到它仍然无限期地运行。

为什么要创建这么多间隔,如何让它只运行360次?另外,这是保存间隔的正确方法,所以我可以使用clearInterval来停止执行吗?

1 个答案:

答案 0 :(得分:2)

问题

setInterval并不意味着“睡眠”,它意味着“每个时间段运行此功能”。

循环播放360次后,您拨打setInterval说“每个 i秒运行此功能

所以你得到360倒计时,每次倒计时都会运行一个函数,然后重新开始倒计时再次运行该函数。


解决方案

请勿使用setInterval。使用setTimeout

或者,或者:

我通常会避免同时设置360个计时器,而是执行以下操作:

var i = 0;

function next() {
    console.log(i);
    i++;
    if (i < 360) {
        setTimeout(next, 1000);
    }
}

next();