我目前有一个Javascript forEach()循环,但是我需要更改代码以在第500次迭代中添加一个“睡眠”。
这种模式让我每次迭代都睡了3秒钟:
How do I add a delay in a JavaScript loop?
for (let i=1; i<10; i++) {
setTimeout( function timer(){
alert("hello world");
}, i*3000 );
}
每2次或每500次迭代我怎么睡觉?
PS:
该解决方案需要在Chrome和IE11上运行。
答案 0 :(得分:3)
递归超时解决方案:
const processInBatches = (array, limit, processFn, timeout) => {
const batch = array.slice(0, limit);
if(!batch.length) {
return;
}
batch.forEach(processFn);
const rest = array.slice(limit);
setTimeout(() => processInBatches(rest, limit, processFn, timeout), timeout);
}
const array = ['a', 'b', 'c', 'd'];
processInBatches(array, 2, (x) => console.log('processing',x), 1000);
答案 1 :(得分:2)
您可以创建一个函数,该函数捕获闭包中的循环变量,并返回带有循环的简单函数,该循环以批处理大小返回。效果是,它使您可以从上次停止的地方继续执行for循环。如果有,则返回一个布尔值,指示是否完成操作,您可以将整个内容包装在setInterval
中。显示比解释容易:
function batch(batch_size, end){
var i = 0 // capture i in closure
return function(){
for(i; i <= end; i++){
console.log("doing something", i) // work goes here
if (!((i+1) % batch_size)) return i++
}
return false
}
}
var f = batch(5, 11) // 0 - 11 batched in groups of 5
if (f()){ // start immediately, then setInterval if not finished in one batch.
var interval = setInterval(() => {
f() || clearInterval(interval)
}, 2000 )
}