如何在Javascript循环中每N次迭代睡眠一次?

时间:2018-09-02 01:36:57

标签: javascript

我目前有一个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上运行。

2 个答案:

答案 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 )
}