javascript - 如何在 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。
解决方案
您可以使用async
and以一种相当简单的方式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 个元素的数组。在假设您可能是故意这样做的情况下,我以您的方式留下了代码。
推荐阅读
- python - 按允许的列值组合列表过滤 df
- go - K8s中如何根据与pod的交互获取用户的ip
- flutter - 在 Flutter 中保存抽屉的状态
- react-native - 类型错误:'(0, _reactNavigation.StackNavigator)') 不是函数
- javascript - React-Image-Annotate - SyntaxError:无法在模块外使用导入语句
- reactjs - React Hooks - 在依赖于 Props 的 useEffect 中重试失败的异步请求
- gradle - 无法让 Micrometer Prometheus 下载到我的 Grails 2 应用程序中
- micronaut - 自定义数据源的 Micronaut-Data 问题
- .htaccess - htaccess 将 URL 从 https://www.test.com/demo 重写为 https://www.test.com/test/demo 的问题
- reactjs - 停止值在反应为零后变为负数