如何使用循环索引保存/清除setTimeout的数组?

时间:2016-05-28 10:26:56

标签: javascript arrays loops closures settimeout

我多次调用for循环。我想为每个索引保存一个setTimeout。我的想法是使用循环索引作为setTimeout的数组索引,但是setTimeout返回一个增量ID号,我想重置它,或者覆盖以控制返回的ID,所以我可以识别具有给定索引的每个超时,总是在循环执行的索引的范围内,一遍又一遍地执行。以后能够使用clearTimeout和特定的索引。

var timeouts = [];
for(var i=0; i < 5 ; i++) {
   ...
   (function(delay, timeouts, i){
      // Keeps a reference of the timeout to clear it later.
      timeouts[i] = setTimeout(function() {
         countInView--;
      }, delay);
      console.log("i: "+5+ " | timeout: "+timeouts[i]);
      // i: 5 | timeout: 25 -> Surpasses index, 
      // I'd like to override positions by ID or by index.
   }(delay, timeouts, i));
   ...
}
  1. 当循环执行多次时,timeouts[i]值超过循环索引的值:

  2. 我只想清除代码其他部分的超时,但是当到达代码的这一部分时,timeouts[i]的值可能是140,并且仅循环i值3,所以我永远无法清除要保存的第3个(也没有)setTimeout:

    clearTimeout(timeouts[i]);
    

1 个答案:

答案 0 :(得分:1)

您可以使用2维数组,第一维将随for循环索引一起变化,而第二维可保持为0以控制每次迭代的指定超时ID。

用于在循环中的索引中保存setTimeout

var timeouts = []; // Two  dimensional array
for (i = 0; i < 5; i++)  
    timeouts[i] = [];

for(var i=0; i < 5 ; i++) {
    ...
    (function(delay, $element, savedtimeout){
        savedtimeout[0] = setTimeout(function() {
            countInView--;
        }, delay, savedtimeout);
    }(delay, $element, timeouts[i]));
    ...
}

用于在循环中的索引中清除setTimeout

if(timeouts[i][0] != null) {
    //Removes the timeout from the queue
    clearTimeout(timeouts[i][0]);
}