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

如何在Javascript循环中每N次迭代休眠一次?,javascript,Javascript,我目前有一个Javascript forEach()循环,但我需要更改代码,以便每500次迭代添加一个“sleep” 此模式允许我在每次迭代中睡眠3秒: 用于(设i=1;i递归超时解决方案: const processInBatches = (array, limit, processFn, timeout) => { const batch = array.slice(0, limit); if(!batch.length) { return;

我目前有一个Javascript forEach()循环,但我需要更改代码,以便每500次迭代添加一个“sleep”

此模式允许我在每次迭代中睡眠3秒:


用于(设i=1;i递归超时解决方案:

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);

您可以创建一个函数,该函数捕获闭包中的循环变量,并返回一个简单函数,该函数带有一个按批大小返回的循环。其效果是,它允许您在停止的地方继续for循环。如果您让它返回一个布尔值,指示是否已完成,您可以将整个过程包装在
setInterval
中。显示比解释更容易:

功能批次(批次大小,结束){
var i=0//在闭包中捕获i
返回函数(){
因为(我;我){
f()| |清除间隔(间隔)
}, 2000 )

}
如果((i+1)%iterationCount==0){/*sleep*/}
?当然,这不会阻止for循环继续执行-异步代码保持异步使用
Math.floor(i/500)*3000
对于delaygood这一点,尽管基于是否最终需要返回累积值的问题,这一点很模糊,但11不支持速记函数定义。如果要使用transpiler,那么也可以使用async+Promissions。我喜欢这个解决方案。我很好奇为什么没有分号:(充分披露:就个人而言,我是一个“总是使用大括号”的人…@palsm4这是分号的风格问题。大多数情况下都不需要大括号,我认为没有大括号的JS更容易看(也许这是我的python成长过程)。不过,我不会就此置之不理——总是使用大括号有很好的理由。
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);