Javascript JS:如何在for循环中重置索引,使其再次循环而不会出现大量超时错误?
我正在开发一个自定义JS缩略图转换器,它可以正常工作。我希望它无限期地循环缩略图。此时,它一直运行到Javascript JS:如何在for循环中重置索引,使其再次循环而不会出现大量超时错误?,javascript,for-loop,Javascript,For Loop,我正在开发一个自定义JS缩略图转换器,它可以正常工作。我希望它无限期地循环缩略图。此时,它一直运行到i==thumbs,然后停止。以下是代码截取: for (var i = 1; i <= thumbs; i++) { timer[i] = setTimeout("Thumbchange('" + image_id + url + i + '.jpg' + "')", i * 100 * 10); } while(i请记住,i永远不会达到>thumb的值,因为这是循环的终止条件
i==thumbs
,然后停止。以下是代码截取:
for (var i = 1; i <= thumbs; i++) {
timer[i] = setTimeout("Thumbchange('" + image_id + url + i + '.jpg' + "')", i * 100 * 10);
}
while(i请记住,i
永远不会达到>thumb
的值,因为这是循环的终止条件
您的问题是在这种情况下:
if (i>thumbs)
将其更改为:
if(i == thumbs)
现在,您的代码应该如下所示:
for (var i=1; i<=thumbs; i++) {
timer[i] = setTimeout("Thumbchange('" + image_id + url + i + '.jpg' + "')", i*100*10);
if (i==thumbs) {
i=1;
clearTimeout(timer[i]);
continue;
}
}
for(var i=1;i在无休止的循环中使用setTimeout
是一种糟糕的做法,因为您最终会在很短的时间内创建数千个超时。
这就是你的浏览器崩溃的原因。在(比方说)5秒内,你最终创建了(比方说)10000个超时,而浏览器无法跟上,因此崩溃是因为你消耗了太多的内存
最好在最后一个超时被触发后创建一个新的超时
var i = 1;
var changeAfterTimeout = function () {
i++;
// check if we have finished the thumbnails. If so, start over
if (i == thumbs) {
i = 1;
}
Thumbchange(image_id + url + i + ".jpg");
// call again after 5 seconds
setTimeout(changeAfterTimeout, 5000);
}
changeAfterTimeout();
这样,在任何给定的时间,我们只有一个超时运行。或者使用setInterval
,它将永远自动循环或直到您清除它。
请注意,在setInterval
和setTimeout
中,应使用函数而不是计算字符串
var img = 0;
Thumbchange (image_id + url + img + '.jpg'); // Initialise img 0
window.setInterval (function () { // Invoked once per interval
if (++img == thumbs) // inc image and reset to 0 when it reaches thumbs
img = 0;
Thumbchange (image_id + url + img + '.jpg'); // do image change
}, 1000); // 1 second per image
如果(i==thumbs)
应该这样做,你想这样做X次,或者永远?;)if(i==thumbs)
应该这样做,但是……这将导致一个无休止的循环setTimeout(“Thumbchange”)(“…
请不要再这样做了。我将问题修改得更具体一些。感谢大家提供的有用建议。@VitaliyPetrychuk您如何编写该行以绕过设置超时问题?为了防止因超时而崩溃,是否有办法修改for循环,使其不依赖于设置超时
?您的答案是:我有很多见解,谢谢。有没有办法不依赖于特定的超时(比如5秒)呢?你是什么意思?你是说必须指定setTimeout
的第二个参数?
var i = 1;
var changeAfterTimeout = function () {
i++;
// check if we have finished the thumbnails. If so, start over
if (i == thumbs) {
i = 1;
}
Thumbchange(image_id + url + i + ".jpg");
// call again after 5 seconds
setTimeout(changeAfterTimeout, 5000);
}
changeAfterTimeout();
var img = 0;
Thumbchange (image_id + url + img + '.jpg'); // Initialise img 0
window.setInterval (function () { // Invoked once per interval
if (++img == thumbs) // inc image and reset to 0 when it reaches thumbs
img = 0;
Thumbchange (image_id + url + img + '.jpg'); // do image change
}, 1000); // 1 second per image