如何实现首次立即执行且窗口期后仍严格限流的函数节流?
用Lodash的_.throttle实现批量限流需求
可以实现,但默认的{leading: true, trailing: true}配置没法直接满足批量处理等待请求的需求——它只会保留首次和最后一次调用,中间的调用会被丢弃,不会批量收集。要达成目标,需要结合队列来收集等待中的请求参数,再配合节流逻辑统一处理。
具体实现思路
- 维护一个队列,用来存储所有等待处理的请求参数
- 用
_.throttle包装一个批量处理函数,配置leading: true保证首次调用立即执行,trailing: true保证最后一次等待的请求也会被处理 - 每次触发限流函数时,先把请求参数加入队列,再由节流后的批量函数统一处理队列中的所有请求
代码示例
const _ = require('lodash'); // 存储待处理的请求队列 const requestQueue = []; // 实际批量处理请求的函数 function processBatchRequests() { if (requestQueue.length === 0) return; // 取出队列中所有请求参数,批量处理 const batchParams = [...requestQueue]; requestQueue.length = 0; // 清空队列 // 这里替换成你的第三方服务请求逻辑 console.log(`批量处理请求,共${batchParams.length}个:`, batchParams); } // 节流包装批量处理函数,每3秒最多执行一次 const throttledProcess = _.throttle(processBatchRequests, 3000, { leading: true, trailing: true }); // 对外暴露的限流函数,每次调用时先把参数加入队列,再触发节流逻辑 function limitSpeedRequest(params) { requestQueue.push(params); throttledProcess(); } // 测试调用 limitSpeedRequest('请求1'); // 立即执行,处理请求1 setTimeout(() => limitSpeedRequest('请求2'), 1000); setTimeout(() => limitSpeedRequest('请求3'), 2000); // 3秒后,批量处理请求2、3 setTimeout(() => limitSpeedRequest('请求4'), 4000); // 立即执行,处理请求4
逻辑说明
- 首次调用
limitSpeedRequest时,参数被加入队列,throttledProcess因为leading: true会立即执行,处理队列中的请求 - 3秒内的后续调用只会把参数加入队列,不会触发
processBatchRequests,直到3秒时间窗口结束 - 时间窗口结束后,
trailing: true会触发processBatchRequests,批量处理队列中所有积累的请求 - 如果在3秒窗口结束后再次调用,会重新开启新的窗口,再次立即执行
内容的提问来源于stack exchange,提问作者shtse8
相关产品推荐
相关产品推荐

