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

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.kler.cn/a/449379.html

相关文章:

  • 1 软件工程——概述
  • 矩阵:Input-Output Interpretation of Matrices (中英双语)
  • 基于蜂鸟视图的智慧可视化巡检管理系统研究
  • Debian11 安装MYSQL8 签名错误
  • 详细ECharts图例3添加鼠标单击事件的柱状图
  • 精通Redis
  • 【唐叔学算法】第17天:排序算法之插入排序
  • GPU环境配置
  • 华为OD --- TLV解码
  • Go怎么做性能优化工具篇之基准测试
  • 芝法酱学习笔记(2.2)——sql性能优化2
  • 0.96寸OLED显示屏详解
  • Day1 苍穹外卖前端 Vue基础、Vue基本使用方式、Vue-router、Vuex、TypeScript
  • Python实现将series系列数据格式批量转换为Excel
  • OCR(五)linux 环境 基于c++的 paddle ocr 编译【CPU版本 】
  • 高原地区无人机巡检作业技术详解
  • 螺栓连接|结构强度与刚度评定
  • C++练习题之计算天数
  • SpringBoot3-第二篇(Web开发)
  • 使用FreeNAS软件部署ISCSI的SAN架构存储(IP-SAN)练习题
  • 物联网水文观测设备
  • 蓝桥杯物联网开发板硬件组成
  • 汽车IVI中控开发入门及进阶(41):视频播放器MPlayer
  • 单片机的内存是指RAM还是ROM
  • Android Studio Gradle Sync timeout
  • H5海康WS在线视频播放器:打造高效流畅的Web视频体验