欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > vue前端实现同步发送请求,可设置并发数量【已封装】

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

2024/12/24 17:20:29 来源:https://blog.csdn.net/qq_57420582/article/details/144673506  浏览:    关键词: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()})})},

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com