暂停JavaScript异步循环一段时间

Pausing JavaScript Asynchronous Loop for some time

本文关键字:一段时间 循环 异步 JavaScript 暂停      更新时间:2023-09-26

我有一个暂停异步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(){
    }    
});

首先,我试图将这段代码用于在循环函数中暂停循环,但是这不起作用,现在我部分理解了为什么。然而,我尝试的其他方法也都失败了。有人知道我要怎么做吗?

Thanks in advance

下面是我编写的一个片段。它将调用functionToLoop loops次,每次pauseAt运行时暂停pauseTimeout毫秒,然后在最后调用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);

这是你想要的。也许你可以根据自己的需要调整一下。把它粘贴到你的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是单线程的,你不能在不使整个运行时停止的情况下"暂停"。