如何使用循环的索引保存/清除 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]);
    
您可以使用二维

数组,第一维将随着 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]));
    ...
}

用于清除循环中索引内的超时

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

最新更新