2014-06-16 101 views
0

我有一段時間暫停執行異步JS循環的問題。暫停JavaScript異步循環一段時間

我需要暫停,例如每45次迭代,所以我想出了一個簡單的代碼來幫助我確定當它發生:

if (i > 1) 
{ 
    var numba = i/45; 

    if (isInteger(numba)) 
    { 
     document.write('TIMEOUT START <br>'); 
     setTimeout(function(){document.write('TIMEOUT END<br>');}, 540000); 
    } 
} 

function isInteger(x) 
{ 
     return x % 1 === 0; 
} 

我的異步循環代碼如下:

var num = 150; 

var asyncLoop = function(o) 
{ 
    var i=0; 

    var loop = function(){ 
     i++; 
     if(i==o.length){o.callback(); return;} 
     o.functionToLoop(loop, i); 
    } 
    loop();//init 
} 


asyncLoop({ 
    length : num, 
    functionToLoop : function(loop, i) 
    { 
      if (i==0){} 
      loop(); 

    }, 
    callback : function(){ 
    }  
}); 

首先,我試着將這段代碼放在循環函數中暫停循環,但是這並不起作用,現在我部分理解了爲什麼。然而,我嘗試過的其他方式也失敗了。 有誰知道如何實現我想要做的?

在此先感謝

+1

爲什麼要暫停? – Joe

+0

2段代碼似乎沒有關係。另外,asyncLoop不是一個循環,而是遞歸調用它自己。 – tcooc

+0

這是因爲循環獲取我的帖子的Facebook上的數據(通過graph.facebook.com),並且當我有大約1k個帖子來查詢時,似乎在300個URL通過graph.facebook.com運行後,我需要它「冷卻」幾分鐘 –

回答

0

這是我鞭打的片段。 它會調用functionToLooploops次,暫停pauseTimeout毫秒,每個pauseAt運行,然後在末尾調用callback

function loopWithPause(functionToLoop, callback, loops, pauseAt, pauseTimeout) { 
    var n = 0; 
    function start() { 
     if(n + pauseAt > loops) pauseAt = loops- n; 
     for(var i = 0; i < pauseAt; i++) { 
      functionToLoop(n + i); 
     } 
     n += pauseAt; 
     if(n == loops) callback(); 
     else setTimeout(start, pauseTimeout); 
    } 
    start(); 
} 

例子:

loopWithPause(function(i){console.log(i)}, function(){console.log('done!')},10, 2, 2000); 

輸出:

0 
1 
(2 second pause) 
2 
3 
(2 second pause) 
4 
5 
(2 second pause) 
6 
7 
(2 second pause) 
8 
9 
done! 

爲您的方案的通話將可能是:

loopWithPause(functionToLoop, callback, 150, 45, 540000); 
+0

謝謝,這個作品精湛! –

0

這就是你要求的。也許你可以適應你的需要。將其粘貼到您的JavaScript控制檯並觀看它永遠運行。

var printNumbers = function(startingAt) { 
    var end = startingAt + 45; 
    for (i = startingAt; i < end; i++) 
    { 
    console.log(i) 
    } 
    window.setTimeout(function() { printNumbers(end); }, 1000) 
} 


printNumbers(0) 

它幾乎是遞歸的,除了遞歸通過事件循環發生超時。

這通過變量傳遞狀態,以便下次該函數運行時使用(或者使用全局變量或閉包來包含函數執行之間的狀態)。這是做這種事的唯一方法,因爲JavaScript是單線程的,如果不停止整個運行時間,就不能'暫停'。