2012-01-01 130 views
2

我希望能夠每6秒鐘調用一次函數work()。我的jQuery代碼是setTimeout和setInterval不起作用

function looper(){ 
    // do something 
    if (loopcheck) {   
    setInterval(work,6000); 
    } 
    else { 
    console.log('looper stopped'); 
    } 
} 

我遇到的問題是它快速循環兩次工作,然後它將等待6秒鐘。我嘗試使用setTimeout具有類似的結果。

在延遲工作之前可能會導致工作被調用兩次的原因是什麼?

+2

顯示完整的js代碼,當您調用活套。也許這個函數被調用兩次 – Kokers 2012-01-01 20:51:41

+0

你確定你的代碼中沒有被調用其他工作嗎? – kinakuta 2012-01-01 20:51:51

回答

1

setInterval should be avoided。如果你想工作,反覆調用每6秒,考慮遞歸調用setTimeout的,而不是

function loopWork(){ 
    setTimeout(function() { 
     work(); 
     loopWork(); 
    }, 6000); 
} 

然後

function looper(){ 
    // do something 
    if (loopcheck) {   
    loopWork() 
    } 
    else { 
    console.log('looper stopped'); 
    } 
} 

如果你想停止這個當然,你會救到setTimeout的最後一次通話的價值,並將其傳遞給clearTimeout

var timeoutId; 
timeoutId = setTimeout(function() { 
    work(); 
    loopWork(); 
}, 6000); 

然後停止它

clearTimeout(timeoutId); 
+0

當然注意到這不會每六秒運行一次函數,它會運行該函數,然後在六秒鐘後安排下一個函數 - 所以如果函數需要一秒鐘運行,它將每7秒運行一次。 (當然,大多數_sensible_ JS代碼不需要整秒運行,但仍然...) – nnnnnn 2012-01-01 22:28:57

+0

@nnn - 這是一個很好的觀點,謝謝 – 2012-01-01 22:35:13

0

使用舊式的setTimeout()

 var i=0; 
     function work(){ 
      console.log(i++); 
     } 
     function runner(){ 
      work(); 
      setTimeout(runner, 6000); 
     }    
     runner(); 
0

我更喜歡下面的模式我自己,我發現很容易遵循:

function LoopingFunction() { 
    // do the work 

    setTimeout(arguments.callee, 6000); // call myself again in 6 seconds 
} 

如果你希望能夠在任何阻止它點:

var LoopingFunctionKeepGoing = true; 
function LoopingFunction() { 
    if(!LoopingFunctionKeepGoing) return; 
    // do the work 

    setTimeout(arguments.callee, 6000); // call myself again in 6 seconds 
} 

現在,您可以通過將LoopingFunctionKeepGoing設置爲false來隨時停止它。