我多次调用 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));
...
}
当循环多次执行时,
timeouts[i]
值将超过循环索引的值:我只想清除代码其他部分的超时,但是当到达这部分代码时,
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]);
}