带并发限制的并行Fetch请求实现方案
实现带并发限制的批量URL请求
你当前的代码通过Promise.all一次性发起所有URL请求,当URL数量超过20个时容易触发API限流。下面是修改后的代码,实现每次仅并发5个请求,完成一批后再执行下一批的逻辑:
async function getAllUrlsWithLimit(urls, limit = 5) { const results = []; // 按指定并发量分批处理URL for (let i = 0; i < urls.length; i += limit) { // 截取当前批次的URL const currentBatch = urls.slice(i, i + limit); // 并发处理当前批次的请求 const batchResults = await Promise.all( currentBatch.map(url => fetch(url) .then(response => response) // 可根据需求修改,比如response.json() .catch(err => { console.error(`请求 ${url} 失败:`, err); return null; // 保留失败标识,避免中断整个流程 }) ) ); results.push(...batchResults); } return results; }
核心逻辑说明
- 分批处理:通过
for循环按limit(默认5)切割URL数组,每次处理一个批次 - 批次内并发:每个批次内部用
Promise.all同时发起请求,保证批次内的并发效率 - 容错处理:单个请求添加
catch捕获错误,避免某一个请求失败导致整个批次甚至整个任务中断 - 灵活性:
limit参数可自定义,方便根据API限流规则调整并发数
使用示例
// 假设urls是包含20+链接的数组 const urls = ['https://api.example.com/1', 'https://api.example.com/2', ...]; getAllUrlsWithLimit(urls, 5) .then(data => console.log('所有请求结果:', data)) .catch(err => console.error('全局错误:', err));
内容的提问来源于stack exchange,提问作者cidodo7472
相关产品推荐
相关产品推荐

