在一段时间内暂停执行异步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(){
}
});
首先,我试图将暂停循环的代码放在循环函数中,但是这不起作用,现在我已经部分理解了原因。然而,我尝试的每一种方式都失败了。有人知道如何实现我想做的事吗?
提前感谢
发布于 2014-06-16 08:03:11
这是我抽出来的一段片段。它将调用functionToLoop
loops
times,暂停每个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);
发布于 2014-06-16 07:46:09
这符合你的要求。也许你可以让它适应你的需要。将其粘贴到您的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是单线程的,如果不让整个运行时停止运行,就不能“暂停”。
https://stackoverflow.com/questions/24247372
复制