当前位置: 首页 > 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赋值即可

相关文章:

  • 12-Oracle 23ai Vector 使用ONNX模型生成向量嵌入
  • pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
  • DevSecOps新理念
  • 彻底解决 MFC 自绘控件闪烁
  • 短视频矩阵SaaS系统:开源部署与核心功能架构指南
  • C++中switch-case的性能优化策略详解
  • itvbox绿豆影视tvbox手机版影视APP源码分享搭建教程
  • 如何理解OSI七层模型和TCP/IP四层模型?HTTP作为如何保存用户状态?多服务器节点下 Session方案怎么做
  • 学习 React【Plan - June - Week 1】
  • .net 使用MQTT订阅消息
  • AirSim/Cosys-AirSim 游戏开发(三)打包可执行文件
  • AI代码助手需求说明书架构
  • OPenCV CUDA模块光流------高效地执行光流估计的类BroxOpticalFlow
  • day46python打卡
  • 市面上哪款AI开源软件做ppt最好?
  • 【前端】每日一道面试题6:解释Promise.any和Promise.allSettled的使用场景及区别。
  • T/SAIAS 018—2025《具身智能语料库建设导则》研究报告:体系解构与实施路径
  • Nuxt.js 中的路由配置详解
  • Webhook 配置备忘
  • Chrome 浏览器前端与客户端双向通信实战
  • 做网站用啥软件/app拉新推广平台代理
  • 京东网站建设策略/微信怎么做推广
  • asp双语网站后台怎么用/武汉做网络推广的公司
  • 做一家购物网站要多少钱/新闻株洲最新
  • 用个人的信息备案网站吗/人民日报最新新闻
  • 嵊州网站设计/今日重大新闻事件