96SEO 2026-09-08 16:28 34
在前端开发中,往往需要一次性发送成百上千个网络请求。若不做并发控制,短时间内同时抛出的几十甚至上百个请求会导致以下痛点:
对请求做并发限流已成为业务中少不了的需求。下面整理了几种主流的实现方案,包含原理说明、优缺点还有可直接运行的示例代码。

将请求地址数组按最大并发数切割成若干小分片。每个分片内部使用 Promise.all 并行执行,必须等当前分片所有请求完成后才启动下一批。这种方式简单易懂,但如果某个请求特别慢,会拖累整批完成时间。
// batchRequest.js
/**
* @param {string} urls 请求地址数组
* @param {number} limit 每批最大并发数
*/
async function batchRequest {
const result =;说起来,for {
const chunk = urls.slice;const chunkRes = await Promise.all(
chunk.map.n))
);按理说,result.push;}
return result;}
// 示例调用
const urls = Array.from => `https://api.example.com/${i}`);batchRequest.n);其实,
初始化固定数量的并发任务,并通过 Promise.race 等待任意一个完成后立即补充新任务。这样可以始终保持指定并发数,无论有无慢请求,都能高效利用网络资源。此思路即是 p‑limit 库的主要设计。
// slidingWindow.js
/**
* @param {string} urlList 请求地址数组
* @param {number} limit 最大并发数
*/
async function concurrencyRequest {
const results =;// 初始窗口
const promises = urlList.slice.map =>
fetch
.n)
.n)
);let cursor = limit;while {
// 等待任意一个完成
const { data,idx } = await Promise.race;results = data;// 移除已完成 promise
const finishIndex = promises.findIndex(p =>
p.n?.,== undefined // 简化查找方式
);怎么说呢,promises.splice;// 有剩余任务则补充到窗口
if {
const newUrl = urlList;const newP = fetch
.n)
.n);promises.push;}
}
return results;}
// 示例调用
const urls = Array.from => `/api/${i}`);concurrencyRequest.n;说起来,
Sema‑phore是一种通用异步调度工具。用于限制同时运行的任务数量。它维护一个许可计数器,当计数器已满时新来的任务进入等待队列;当已有任务完成后释放许可,唤醒下一个等待者。
// semaphore.js
class Semaphore {
constructor {
this.max = max;this.current = max;this.waitQueue =;}
async acquire {
if {
this.current--;return Promise.resolve;}
return new Promise);}
release {
this.current++;if {
this.current--;const nextResolve = this.waitQueue.shift;nextResolve,}
}
async run {
await this.acquire;
try {
return await taskFn;} finally {
this.release;}
}
}
// 使用示例
const sem = new Semaphore;// 最多三条并行
async function demo {
const urls =;const tasks = urls.map(url =>
sem.run => ).json
));怎么说呢,const results = await Promise.all;console.log,}
demo;
P‑limit 是基于信号量实现的成熟第三方库。可直接满足生产环境中的多种边界需求,如异常捕获、队列监控和取消功能。推荐在项目中使用而非自行重写调度器。
// 安装:npm install p-limit
import pLimit from 'p-limit';
const limitConcurrencyNum=5;const limiter= pLimit;
const urls=Array.from=>https://api.example.com/${i});
// 将所有异步任务交给 limiter 执行,每次最多同时执行5条 const promises=urls.map=>fetch.n)));
Promise.all .n) .catch);
此方案通过维护一个活跃计数和等待队列来控制并发。当活跃数量低于阈值时立即执行新任务,否则将其放入队列。在下一个槽位释放时自动取出下一个任务执行。该方法最适合学习和快速原型,但在生产环境建议使用更健壮的库或信号量模式以处理异常和取消等边界情况。
// queue.js
const MAXCONCURRENTREQUESTS=5;let activeCount=0;const requestQueue=;
// 接收任意 async 函数 taskFn 并返回其 Promise function runTask{ return new Promise=>{ const task=async =>{ try{ activeCount++;const res=await taskFn;resolve,}catch{reject} finally{ activeCount--;if{ requestQueue.shift;怎么说呢,// 执行下一个排队任务 } } };if{ task,}else{ requestQueue.push;} }),}
// 示例: runTask=>fetch.n));runTask=>fetch.n));// 可继续添加更多,…
| 方案名称 技术要点 | 主要特点 | 适用场景 & 建议 |
|---|---|---|
| # 分批 + Promise.all # | 小规模、高均衡耗时且不关心实时率,可快速 prototyping。但慢请求会拖延整个批次应避免大规模混杂耗时差异明显的数据拉取。 | |
| # Promise.race 滑动窗口 # | 资源利用率高。对耗时差异敏感但实现略复杂,需要维护索引保证顺序。适合大数据拉取或文件上传下载等需求。说起来, | |
| # 信号量 Semaphore # | 通用模型。不仅可控制 fetch,还能限制任何 async 函数;实例可复用,是建立自定义调度器的底层骨架。适合需要多处共享相同并行阈值的大型项目。 | |
| # p‑limit 库 # | 工业级方法,具备完整错误捕获、超时与取消功能;易于集成且性能稳定,是业务项目首选。仅需一次 npm 安装即可投入生产。 | |
| # 手写队列 # | 教学与实验用途最佳,可以彻底理解背后逻辑。但若未完善异常与取消机制,在真实项目中容易产生 bug。建议仅用于学习或小型脚本验证。 | |
⚛ | ||
注意不同浏览器同源最大连接数可能略有差别。一般为 6~8,请根据实际情况调整 limit 值。
* 如果你只需要快速 prototyping 且数据耗时相近 → 分批 + Promise.all * 想让吞吐率最大化 → Promise.race 滑动窗口 或 Semaphore * 在正式业务里追求稳定可靠 → p‑limit * 想内部工作原理 → 手写队列 / 信号量
祝你在前端网络编程路上越跑越快 🚀
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback