2013-04-30 39 views
0

我正在通过setInterval()每10ms遍历一个数组中的值。获取setInterval根据数组执行一定的操作次数

但是,因为计算机无法处理快速的迭代,所以我的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); 
+0

你的榜样工作得很好,我 – 2013-04-30 12:41:30

+0

他提到,代码只是一个样本,它是远远更多的CPU到底情况明显。 – Nomad101 2013-04-30 12:42:21

回答

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/

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线的东西去:我把一个MS原因10ms的工作就好对于我来说足够了。

+0

我给了完全相同的答案一分钟前:) – 2013-04-30 12:45:35

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); 

那么你就不必处理与清算超时,你必须也关闭捕捉问题没有全局索引变量。

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> 
+0

,我只是意识到你已经接受了一个答案:) – Akshay 2013-04-30 13:40:01