// 文件路径:utils/BatchUploader.ts /** * BatchUploader 批量上传工具类 * 用于将大量数据分批发送到后端,避免单次请求数据过大导致失败。 * 支持设置每批数据大小、批次间延迟、上传函数和完成回调。 */ export class BatchUploader { private dataList: T[]; // 需要上传的数据列表 private chunkSize: number; // 每批上传的条数 private delay: number; // 每批上传之间的延迟时间(单位:毫秒) private uploadFunc: (chunk: T[], batchIndex: number, totalBatches: number) => Promise; // 每一批次的上传函数 private onComplete?: () => void; // 所有批次完成后的回调函数(可选) /** * 构造函数,初始化批量上传器 * @param options 配置参数 */ constructor(options: { dataList: T[]; // 待上传的数据 chunkSize?: number; // 每批数据大小(默认 8000) delay?: number; // 每批之间的延迟(默认 200ms) uploadFunc: (chunk: T[], batchIndex: number, totalBatches: number) => Promise; // 上传逻辑函数 onComplete?: () => void; // 所有批次完成后的回调函数(可选) }) { const { dataList, chunkSize = 8000, delay = 200, uploadFunc, onComplete } = options; this.dataList = dataList; this.chunkSize = chunkSize; this.delay = delay; this.uploadFunc = uploadFunc; this.onComplete = onComplete; } /** * 启动批量上传任务 */ public async start() { const total = Math.ceil(this.dataList.length / this.chunkSize); // 计算总批次数 // 循环执行每一批上传任务 for (let i = 0; i < total; i++) { // 截取当前批次的数据 const chunk = this.dataList.slice(i * this.chunkSize, (i + 1) * this.chunkSize); // 调用传入的上传函数处理该批次数据 await this.uploadFunc(chunk, i + 1, total); // 如果不是最后一批,添加延迟 if (this.delay > 0 && i + 1 < total) { await new Promise((res) => setTimeout(res, this.delay)); } } // 所有批次上传完成后,执行完成回调(如果有的话) this.onComplete?.(); } } //使用示例 // const uploader = new BatchUploader({ // dataList: features, // chunkSize: 15000, // delay: 200, // uploadFunc: async (chunk, batchNum, totalBatch) => { // await addProjectPilePoint();//异步方法 // }, // onComplete: () => { // console.log('桩点上传完成'); // } // }); // await uploader.start();