setTimeout和setInterval不起作用

时间:2012-01-01 20:47:25

标签: javascript jquery

我希望能够每6秒调用一次函数work()。我的jQuery代码是

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

我遇到的问题是它快速循环工作两次,然后等待6秒。我尝试使用setTimeout得到类似的结果。

什么可能导致工作在延迟工作之前被调用两次?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

使用旧式setTimeout()

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

答案 2 :(得分: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来随时停止它。