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

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.xdnf.cn/news/12581.html

相关文章:

  • 通过跳板机连接远程主机
  • 【佳易王个体诊所电子处方软件】助力智慧诊疗! #医疗数字化 #电子处方效率提升
  • MySQL体系架构解析(三):MySQL数据存储的揭秘
  • 从0到1写一个适用于Node.js的User Agent生成库
  • 矩阵和向量范数的区别分析
  • GAN模式奔溃的探讨论文综述(一)
  • SQL进阶之旅 Day 17:大数据量查询优化策略
  • C++.OpenGL (9/64)复习(Review)
  • 【论文阅读笔记】万花筒:用于异构多智能体强化学习的可学习掩码
  • vb监测Excel两个单元格变化,达到阈值响铃
  • 【Linux跬步积累】—— 网络编程套接字(二)
  • 精益数据分析(94/126):30/10/10用户参与法则与定价策略的科学制定
  • Linux(Centos 7.6)命令详解:sed
  • react public/index.html文件使用env里面的变量
  • gitee 拉取失败
  • javascript中Cookie、BOM、DOM的使用
  • JS设计模式(4):观察者模式
  • java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟
  • vsCode使用本地低版本node启动配置文件
  • sklearn 和 pytorch tensorflow什么关系
  • k8s部署dify
  • Python打卡第46天
  • 埃文科技智能数据引擎产品入选《中国网络安全细分领域产品名录》
  • for AC500 PLCs 3ADR025003M9903的安全说明
  • Linux配置yum 时间同步服务 关闭防火墙 关闭ESlinux
  • DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
  • 12.5Swing控件3Jpanel JOptionPane
  • 03 mysql 的环境搭建
  • 计算机视觉与深度学习 | 基于MATLAB的相机标定
  • 【Go语言基础【7】】条件语句