使用 Service Worker 限制请求并发数

原理

  1. 监听 fetch 事件,在事件处理函数中判断当前并发数是否超过限制。
  2. 如果超过限制,将请求加入队列,等待其他请求完成。
  3. 如果没有超过限制,直接发送请求。

实现

在 index.html 中注册 Service Worker
html 复制代码
<!DOCTYPE html>
<html lang="zh_CN">
  <body>
    <div id="app"></div>
    <script>
      if ("serviceWorker" in navigator) {
        window.addEventListener("load", () => {
          navigator.serviceWorker.register("/sw.js", {
            scope: "/",
          });
        });
      }
    </script>
    <script type="module" src="./src/main.ts"></script>
  </body>
</html>
添加 sw.js
js 复制代码
// 最大并发数
const MAX_CONCURRENT = 8;
let activeCount = 0;
const requestQueue = [];
self.skipWaiting();
self.addEventListener("fetch", (event) => {
  // 对部分接口进行限制并发数,其他请求直接放行,例如对包含 xxx.api. 的接口限制并发数
  if (!["xxx.api."].some((item) => event.request.url.includes(item))) {
    return;
  }
  // 克隆请求对象,因为请求体只能读取一次
  const request = event.request.clone();
  // 将请求加入队列
  const promise = new Promise((resolve, reject) => {
    requestQueue.push({ request, resolve, reject });
    processQueue();
  });

  event.respondWith(promise);
});

function processQueue() {
  // 队列为空或已达到最大并发数则不处理
  if (requestQueue.length === 0 || activeCount >= MAX_CONCURRENT) {
    return;
  }

  // 从队列中取出下一个请求
  const { request, resolve, reject } = requestQueue.shift();
  activeCount++;

  // 处理请求
  fetch(request)
    .then((response) => {
      resolve(response);
    })
    .catch((error) => {
      reject(error);
    })
    .finally(() => {
      activeCount--;
      processQueue(); // 处理下一个请求
    });
}
检查 Service Worker 是否生效


接口前有特殊图标或者实际的请求接口有 from service worker 表示成功。

在 Application 中也能查看对应的 Service Worker 是否注册成功

相关推荐
DanCheOo7 分钟前
AI 应用的安全架构:Prompt 注入、数据泄露、权限边界
前端·人工智能·prompt·安全架构
We་ct1 小时前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
weixin_427771612 小时前
前端调试隐藏元素
前端
爱上好庆祝2 小时前
学习js的第五天
前端·css·学习·html·css3·js
C澒3 小时前
IntelliPro 产研协作平台:基于 AI Agent 的低代码智能化配置方案设计与实现
前端·低代码·ai编程
一袋米扛几楼983 小时前
【Git】规范化协作:详解 GitHub 工作流中的 Issue、Branch 与 Pull Request 最佳实践
前端·git·github·issue
网络点点滴3 小时前
前端与后端的区别与联系
前端
EnCi Zheng3 小时前
M5-markconv自定义CSS样式指南 [特殊字符]
前端·css·python
kyriewen4 小时前
你的网页慢,用户不说直接走——前端性能监控教你“读心术”
前端·性能优化·监控
广州华水科技4 小时前
北斗GNSS变形监测在大坝安全监测中的应用与优势分析
前端