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

相关推荐
知了学历孙老师5 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
ShineWinsu7 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
福兮说8 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
程序员老赵10 小时前
Docker 部署青龙面板:轻松搭建定时任务管理平台
前端·docker·开源
Swot10 小时前
Asciidoctor 公式数字下标错位问题:原因分析与解决方案
前端
Swot10 小时前
leo-editor 中将 Markdown 内容转成 asciidoc 格式
前端
狒狒AI10 小时前
Remotion / GSAP+Three / HyperFrames / Skia 四栈实测:代码渲染知识视频的选栈方法(附开源技能)
前端·人工智能·aigc
修炼的dance10 小时前
浏览器里导出H.265,8.5秒和55.5秒差在硬件
前端
补码缩写10 小时前
WebCodecs选编码器,探测之后还要验解码和播放
前端
大文说跨境10 小时前
亚马逊多账号管理浏览器怎么选?云登/紫鸟/AdsPower 对比
java·前端·自动化