暂停JavaScript异步循环一段时间

时间:2014-06-16 15:38:18

标签: javascript asynchronous

我有一个问题就是暂停执行异步JS循环一段时间。

我需要暂停,例如每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(){
    }    
});

首先,我尝试将此代码放置在循环函数中暂停循环,但是这不起作用,现在我部分理解了原因。然而,我试过的其他方式也失败了。 有谁知道如何实现我想要做的事情?

提前致谢

2 个答案:

答案 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是单线程的,你不能在没有让整个运行时停止运行的情况下“暂停”。

答案 1 :(得分:0)

这是我掀起的片段。 它将调用functionToLoop loops次,暂停每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);