首页 > 解决方案 > 如何在 x 次迭代后暂停循环 x 秒然后恢复

问题描述

所以我有一个数组,其中包含我想加入的频道名称列表(这是用于 Twitch 聊天机器人),用于加入频道的 API 端点的速率限制为每 15 秒 50 次加入。我试图找出遍历 50 个通道名称的最佳方法,暂停 15 秒,然后继续遍历数组的其余部分,每 50 个名称暂停 15 秒。

我最初尝试使用假的 100 值数组、模运算符和 setTimeout 进行通用 for 循环,但无济于事。但老实说,我不知道从哪里开始,所以这很糟糕。

let array = ([...Array(100).keys()].map(x => ++x))

for (var i = 1; i < array.length; i++) {
    if (i % 50 === 0) {
        setTimeout(() => {
            console.log('Waiting 15 seconds.')
        }, 15000);
    } else {
        console.log(array[i])
    }
}

理想情况下,它会记录 1-50,然后等待 15 秒,然后记录 51-100。

标签: javascriptnode.jsloops

解决方案


您可以使用asyncand以一种相当简单的方式await暂停循环:for

// utility function that returns a promise that resolves after t milliseconds
function delay(t) {
    return new Promise(resolve => {
        setTimeout(resolve, t);
    });
}

async function processArray(array) {

    for (let i = 1; i < array.length; i++) {
        if (i % 50 === 0) {
            await delay(15 * 1000);
        } 
        console.log(array[i])
    }
}

let data = ([...Array(100).keys()].map(x => ++x))
processArray(data).then(() => {
    console.log("all done");
});

仅供参考,我不太明白您为什么要在 100 个元素的数组上使用索引 1 到 100。我认为您应该将索引 0 到 99 用于 100 个元素的数组。在假设您可能是故意这样做的情况下,我以您的方式留下了代码。


推荐阅读