当前位置: 首页 > news >正文

VUE解决页面请求接口大规模并发的问题(请求队列)

方案1: 请求队列

// RequestQueue.js 
export default class RequestQueue {constructor(maxConcurrent) {this.maxConcurrent = maxConcurrent; // 最大并发请求数this.currentConcurrent = 0; // 当前并发请求数this.queue = []; // 请求队列this.requestId = 0; // 请求ID计数器}add(request, meta = {}) {return new Promise((resolve, reject) => {const id = ++this.requestId;this.queue.push({id,request: () => request().then(res => ({id,res})), // 响应携带IDresolve,reject,meta, // 可携带业务标识});this.processQueue();})}processQueue() {while (this.queue.length > 0 && this.currentConcurrent < this.maxConcurrent) {const task = this.queue.shift();this.currentConcurrent++;task.request().then(({id,res}) => {task.resolve({id,meta: task.meta,data: res}); // 返回完整响应}).catch(task.reject).finally(() => {this.currentConcurrent--;this.processQueue();});}}
}

组件调用

import request from '@/utils/request.js'; /** axios的二次封装 */
import RequestQueue from '@/utils/RequestQueue.js';// 使用请求队列
const requestQueue = new RequestQueue(3); // 设定最大并发请求数const urls = [{url: '/slider/getSliders',method: '', // 请求方法data: '',  //  请求参数id: 1,reqType: 'getSliders' // 请求唯一标识符},{url: '/course/mostNew',method: 'post',data: newCoursePageInfo,id: 2,reqType: 'mostNew'},{url: '/course/search',method: 'post',data: interestCoursePageInfo,id: 3,reqType: 'search'}
];// 请求函数:
const fetchData = ({ url, method, data }) => {return request(url, data, method).then((res) => {return res;// res.json();  // 如果是Fetch API必须要显式调用.json()方法解析响应体,注释上边用这个});
};const requests = urls.map((url) => () => fetchData(url));onLoad(() => {Promise.all(requests.map((req, idx) => requestQueue.add(req, { originalIndex: idx, reqType: urls[idx].reqType }))).then((results) => {// results包含[{id, meta, data},...]  data:响应回的数据results.forEach(({ meta, data }) => {switch (meta.reqType) {case 'getSliders':   // 请求唯一标识符swiperList.value = data.list; break;case 'mostNew':interestCouseInfo.value.push(...data.pageInfo.list);break;case 'search':newCourseInfo.value = data.pageInfo.list.slice(3, 9);break;}console.log(`请求${meta.originalIndex}(${meta.reqType})结果:`, data);});});
});

说明:

  • reqType: 请求唯一标识符,用于将并行发出的请求与响应回的数据对应上
  • request: 对axios做的二次封装,函数fetchData 发出的请求就好比在api文件中的请求函数在这里插入图片描述只需在 对象urls变动url(id可不需要,唯一标识符必须) 和在 results赋值即可
http://www.lqws.cn/news/172603.html

相关文章:

  • 分布式微服务系统架构第144集:FastAPI全栈开发教育系统
  • LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
  • 应用案例 | 设备分布广, 现场维护难? 宏集Cogent DataHub助力分布式锅炉远程运维, 让现场变“透明”
  • 计算机视觉顶刊《International Journal of Computer Vision》2025年5月前沿热点可视化分析
  • 使用MinIO搭建自己的分布式文件存储
  • Git分布式版本控制工具
  • 【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
  • 人机融合智能 | “人智交互”跨学科新领域
  • python中的经典视觉模块:OpenCV(cv2)全面解析
  • 计算机视觉与深度学习 | 基于MATLAB的图像特征提取与匹配算法总结
  • 小白如何在cursor中使用mcp服务——以使用notion的api为例
  • 【 java 集合知识 第二篇 】
  • Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
  • Spark 之 DataFrame 开发
  • 准确--k8s cgroup问题排查
  • http头部注入攻击
  • CVAT标注服务
  • Caliper 配置文件解析:config.yaml 和 fisco-bcos.json 附加在caliper中执行不同的合约方法
  • Ubuntu 基于sdl 音频学习的基础代码
  • 【MATLAB去噪算法】基于ICEEMDAN联合小波阈值去噪算法
  • 【SpringBoot自动化部署】
  • LangChainGo入门指南:Go语言实现与OpenAI/Qwen模型集成实战
  • Matlab实现任意伪彩色图像可视化显示
  • 6.6 day38
  • Web 架构之 CDN 加速原理与落地实践
  • LabVIEW实时系统数据监控与本地存储
  • 保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
  • 从“人找政策”到“政策找人”:智能退税ERP数字化重构外贸生态
  • 自建 dnslog 回显平台:渗透测试场景下的隐蔽回显利器
  • 双碳时代,能源调度的难题正从“发电侧”转向“企业侧”