我多次调用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]);
答案 0 :(得分:1)
您可以使用2维数组,第一维将随for循环索引一起变化,而第二维可保持为0以控制每次迭代的指定超时ID。
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]);
}