Node.js使用Lodash批量异步POST请求的限流方案咨询
处理API限流:两种异步请求方案的实现
刚好之前碰到过一模一样的API限流问题,结合你提到的两个思路,给你具体的代码实现和优缺点分析,都是基于Lodash和异步请求的场景:
方案1:逐请求添加100ms延迟(串行处理)
这是最直接的方案,严格遵守API每0.1秒最多1次请求的限制,每次请求完成后等待100ms再发送下一个。因为Lodash的普通_.forEach是同步遍历,没法直接结合异步操作,所以我们用for...of循环或者Lodash的_.mapSeries来实现串行异步处理:
const _ = require('lodash'); const axios = require('axios'); // 这里用axios举例,你可以换成自己的请求库 // 封装延迟函数 const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms)); async function sendRequestsWithDelay(entries) { // 遍历entries映射,这里用for...of更直观,也可以用_.mapSeries for (const [entryKey, requestPayload] of Object.entries(entries)) { try { // 发送POST请求 const response = await axios.post('https://your-target-api.com/endpoint', requestPayload); console.log(`✅ 条目 ${entryKey} 请求成功:`, response.data); } catch (err) { console.error(`❌ 条目 ${entryKey} 请求失败:`, err.message); } // 等待100ms再发下一个请求 await wait(100); } } // 调用函数,传入你的entries映射 sendRequestsWithDelay(yourEntriesMap);
优点:实现简单,逻辑清晰,完全不会触发API限流;缺点:处理100条数据需要10秒(100*100ms),耗时固定,适合数据量不大的场景。
方案2:分批处理(带重试/批量控制)
如果希望更灵活(比如某批请求失败后可以单独重试),可以把请求分成若干批次(这里因为限流严格,每批只能放1个请求,当然如果API规则调整,也可以改成每批N个),用Lodash的_.chunk来拆分,再串行处理每一批:
const _ = require('lodash'); const axios = require('axios'); const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms)); async function sendRequestsInBatches(entries) { // 把entries转成数组,再拆分成每批1个的小批次 const batches = _.chunk(Object.entries(entries), 1); for (const batch of batches) { const [entryKey, requestPayload] = batch[0]; try { const response = await axios.post('https://your-target-api.com/endpoint', requestPayload); console.log(`✅ 批次 ${entryKey} 请求成功:`, response.data); } catch (err) { console.error(`❌ 批次 ${entryKey} 请求失败,稍后重试...`); // 这里可以加重试逻辑,比如重新加入批次队列 batches.push(batch); // 重试前延长一点等待时间,避免重复触发限流 await wait(500); } // 批次之间等待100ms await wait(100); } } sendRequestsInBatches(yourEntriesMap);
优点:扩展性强,方便添加重试、日志统计等逻辑;缺点:比方案1多了一些代码复杂度,不过对于需要健壮性的场景很实用。
内容的提问来源于stack exchange,提问作者raaone7
相关产品推荐
相关产品推荐

