使用 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 是否注册成功

相关推荐
东东51614 分钟前
果园预售系统的设计与实现spingboot+vue
前端·javascript·vue.js·spring boot·个人开发
rainbow688916 分钟前
Python学生管理系统:JSON持久化实战
java·前端·python
打小就很皮...19 分钟前
React Router 7 全局路由保护
前端·react.js·router
起风的蛋挞29 分钟前
Matlab提示词语法
前端·javascript·matlab
有味道的男人29 分钟前
1688获得商品类目调取商品榜单
java·前端·spring
txwtech36 分钟前
第20篇esp32s3小智设置横屏
前端·html
Exquisite.43 分钟前
企业高性能web服务器---Nginx(2)
服务器·前端·nginx
DFT计算杂谈1 小时前
VASP+PHONOPY+pypolymlpj计算不同温度下声子谱,附批处理脚本
java·前端·数据库·人工智能·python
广州华水科技1 小时前
如何选择合适的单北斗变形监测系统来保障水库安全?
前端
Mr_Xuhhh1 小时前
MySQL表的内连接与外连接详解
java·前端·数据库