2012-01-01 135 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来随时停止它。