Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS:如何在for循环中重置索引,使其再次循环而不会出现大量超时错误?_Javascript_For Loop - Fatal编程技术网

Javascript JS:如何在for循环中重置索引,使其再次循环而不会出现大量超时错误?

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的值,因为这是循环的终止条件

我正在开发一个自定义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
的值,因为这是循环的终止条件

您的问题是在这种情况下:

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