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

vue前端实现同步发送请求,可设置并发数量【已封装】

新建 TaskManager.js

export default class TaskManager {constructor(maxConcurrentTasks = 1) {// 最大并发任务数// to do// 并发任务数大于1 接口开始有概率返回空值,推测是后端问题this.maxConcurrentTasks = maxConcurrentTasks;this.currentTasks = 0;this.taskQueue = [];this.allTasksDone = false; // 终结标识this.allTasksDonePromise = new Promise((resolve) => {this.resolveAllTasksDone = resolve;});}// 添加任务addTask(taskFn) {return new Promise((resolve, reject) => {this.taskQueue.push({ taskFn, resolve, reject });this.processQueue();});}// 处理任务队列async processQueue() {if (this.currentTasks >= this.maxConcurrentTasks || this.taskQueue.length === 0) {return;}if (this.allTasksDone) {// 如果已经标记为所有任务完成,则不再处理新任务return;}const { taskFn, resolve, reject } = this.taskQueue.shift();this.currentTasks++;try {const result = await taskFn();resolve(result);} catch (error) {reject(error);} finally {this.currentTasks--;if (this.currentTasks + this.taskQueue.length === 0) {this.allTasksDone = true;this.resolveAllTasksDone(); // 标记所有任务完成}this.processQueue();}}// 等待所有任务完成waitForAllTasksDone() {return this.allTasksDonePromise;}
}

在项目中使用

import TaskManager from './TaskManager'

 taskManager: null,

this.pdfLoading = true
this.taskManager = new TaskManager()
for (let i = 0; i < this.selectionChangeData.length; i++) {this.taskManager.addTask(() => this.handleDownloadReport(this.selectionChangeData[i]))
}
// 等待所有任务完成
await this.taskManager.waitForAllTasksDone()
this.pdfLoading = false
handleDownloadReport(rowData) {return new Promise((resolve, reject) => {const msg = this.$Message.loading({content: '加载中,请稍等...',duration: 0})let downloadPromises = []downloadPromises.push(this.$http.report.downloadReportExamine({reportId: rowData.id,attachmentExtension: 'pdf'}).then(respT => {// xxx}))downloadPromises.push(this.$http.report.downloadReport({reportId: rowData.id,attachmentExtension: 'pdf'}).then(respT => {// xxx}))Promise.all(downloadPromises).then(() => {msg() // 关闭加载提示resolve()}).catch(error => {console.error('下载报告时发生错误:', error)this.$Message.error('下载报告失败')msg() // 关闭加载提示reject()})})},


http://www.mrgr.cn/news/81205.html

相关文章:

  • 基于角色的访问控制(RBAC)在异构系统中的应用
  • Claude 3.5 Opus并非训练失败:Anthropic自留,用于数据合成与RL训练
  • ansible play-book玩法
  • golang 指针demo
  • SqlSugar查询达梦数据库遇到的异常情况(续)
  • 在linux系统的docker中安装GitLab
  • 重温设计模式--外观模式
  • 网络编程(王铭东老师)笔记
  • 重温设计模式--适配器模式
  • 重温设计模式--设计模式七大原则
  • 解决 Curl 自签名证书验证失败的实用指南
  • 常见数据结构
  • Krita安装krita-ai-diffusion工具搭建comfyui报错没有ComfyUI_IPAdapter_plus解决办法
  • 设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
  • Python(二)str、list、tuple、dict、set
  • 直流有刷电机多环控制(PID闭环死区和积分分离)
  • leetcode 704. 二分查找
  • 【星海随笔】高级系统编辑
  • ARP协议的工作原理
  • 双足机器人《荣耀机甲H1》到手体验
  • docker下载镜像设置
  • 重温设计模式--备忘录模式
  • 谷歌开发者工具-元素篇
  • 重温设计模式--状态模式
  • ArrayList类 (顺序表)
  • Linux的VIM基本操作