for循环里面的方法用setTimeOut定时调用

本文介绍了一种在爬虫程序中使用递归而非循环来定时调用方法的技术,以避免短时间内对目标网站造成过大负担。通过每2秒调用一次详情页抓取函数的方式,确保了爬虫的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近写爬虫程序时,首先获得了url的list列表,然后循环list去调用获取对应url的内容,因为在很短时间内频繁访问某网站存在一定的问题,所以需要在循环里面每间隔2s左右再去调用该方法。具体的实现方式记录如下:

之前的错误写法:

for(var i = 0;i<articleList.length;i++){
 setTimeOut(ArticelDetail.getAticleDetail(articleList[i].contentId)
,2000);
}

上面的写法中只会调用一次中间的函数,所以将循环用递归代替,改进后的方法如下:

//用递归代替循环每隔2S调用一次详细信息爬取事件
var i=0;
function getDetail() {
    i++;
    if(i<articleList.length){
        setTimeout(function(){
            ArticelDetail.getAticleDetail(articleList[i].contentId);
            getDetail();
        },2000);
    }
}
getDetail();

这样便可以实现每隔2S调用获取详情的方法,并且在该递归调用完成后才进行下一步操作。

### JavaScript 中使用 `window.setTimeout` 实现循环定时任务 在 JavaScript 中,虽然 `window.setInterval` 是更常见的实现循环定时任务的方式,但通过合理设计逻辑,可以利用 `window.setTimeout` 来达到相同的效果。这种方式的核心在于每次调用完成后再次设置一个新的超时回调。 以下是基于 `setTimeout` 的循环定时功能的代码示例: ```javascript let counter = 0; function loopTask() { console.log(`当前计数: ${counter}`); // 增加计数值 counter++; // 如果条件满足,则停止循环 if (counter >= 5) { console.log("循环结束"); return; } // 继续下一次循环 setTimeout(loopTask, 1000); // 每隔1秒执行一次 } // 启动第一次循环 setTimeout(loopTask, 1000); ``` #### 解析 上述代码展示了如何通过递归方式调用 `setTimeout` 来模拟循环效果[^1]。 - **初始状态**:定义了一个变量 `counter` 记录当前迭代次数。 - **核心逻辑**:函数 `loopTask` 负责打印当前计数值并判断是否继续运行。 - **终止条件**:当 `counter` 达到指定值(这里是 5),则退出循环不再调用新的 `setTimeout`。 - **延时机制**:通过 `setTimeout` 设置每轮之间的间隔时间(这里为 1 秒)。 这种方法的优点是可以灵活控制每一回合的行为,并且可以在任意时刻中断循环而无需依赖全局清除方法如 `clearInterval()`[^2]。 --- ### 防止内存泄漏注意事项 如果需要长期运行此类循环任务,请注意避免因未清理旧的任务而导致的潜在性能问题。例如,在某些情况下可能需要提前取消尚未到期的 `setTimeout` 请求。可以通过保存返回的 ID 并调用 `clearTimeout(id)` 方法来解决这个问题[^3]。 示例如下: ```javascript let timeoutId; function startLoop() { let count = 0; function task() { console.log(`Counting: ${count++}`); if (count === 5) { stopLoop(); return; } timeoutId = setTimeout(task, 1000); } timeoutId = setTimeout(task, 1000); } function stopLoop() { clearTimeout(timeoutId); console.log("Loop stopped."); } ``` 在此例子中引入了两个辅助函数——`startLoop` `stopLoop`,分别用来启动停止循环过程[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值