2013-04-30 222 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