0

我试图通过 setInterval() 每 10 毫秒迭代一次数组中的值。

但是,由于计算机无法快速处理迭代,因此我的 clearInterval() 实际上是在数组完全迭代之前清除间隔。

下面只是我正在做的一个例子,而不是更多 CPU 密集型的实际代码。

无论 CPU 性能如何,如何修复代码以使其迭代到最后?

var blah = ['a','b','c'];
i=0;

int = setInterval(function(){   
    console.log(blah[i]);
    i++;
},10);

timeout = setTimeout(function(){
    clearInterval(int);
}, blah.length * 10);
4

4 回答 4

2

用这个

var blah = ['a','b','c'];
var i=0;

var intervalId = setInterval(function(){   
    console.log(blah[i]);
    i++;
    if(i==blah.length){ // i== 3 all array elements processed. then clear interval
      clearInterval(intervalId );
    }
},10);

工作示例http://jsfiddle.net/B8ya3/

于 2013-04-30T12:42:58.227 回答
1

我会选择类似的东西

var inter, 
    blah = ['a','b','c','d','e'],
    i=0;
inter = setInterval(function(){   
    console.log(blah[i]);
    i++;
    if (i === blah.length) {
        clearInterval(inter);
    }
},1);

PS:我放了 1 毫秒,因为 10 毫秒对我来说效果很好。

于 2013-04-30T12:43:48.573 回答
0

我会这样解决它:

var blah = ['a','b','c'];

function iterate(index) {
    console.log(blah[index]);
    if(index < blah.length - 1) {
        setTimeout(function() {iterate(++index)}, 10);
    }
}

iterate(0);

然后您就不必处理清除超时,并且您也没有具有闭包捕获问题的全局索引变量。

于 2013-04-30T12:54:27.157 回答
0

我个人不想setInterval用于您正在尝试做的事情。如果您的目标是限制流程,即在给定时间只处理一次迭代,并在下一次流程交互之前添加延迟,则“setInterval”无法强制执行。它只能确保每个流程迭代以固定的时间间隔开始。

我会这样做:

<script>

var items = [1, 2, 3, 4, 5];

function processOffersOneAtATime() {
    if (items.length != 0) {
        var item = items.pop();
        setTimeout(function() {
         console.log(item);
         //do time consuming cpu intensive operation here
         processOffersOneAtATime();
        }, 1000);
    }
}
//kick start the process
 processOffersOneAtATime();
 </script>
于 2013-04-30T13:39:47.727 回答