我有一个问题就是暂停执行异步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(){
}
});
首先,我尝试将此代码放置在循环函数中暂停循环,但是这不起作用,现在我部分理解了原因。然而,我试过的其他方式也失败了。 有谁知道如何实现我想要做的事情?
提前致谢
答案 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);