桩点支架分批次上传
This commit is contained in:
73
src/utils/batchUpload.ts
Normal file
73
src/utils/batchUpload.ts
Normal file
@ -0,0 +1,73 @@
|
||||
// 文件路径:utils/BatchUploader.ts
|
||||
|
||||
/**
|
||||
* BatchUploader 批量上传工具类
|
||||
* 用于将大量数据分批发送到后端,避免单次请求数据过大导致失败。
|
||||
* 支持设置每批数据大小、批次间延迟、上传函数和完成回调。
|
||||
*/
|
||||
export class BatchUploader<T> {
|
||||
private dataList: T[]; // 需要上传的数据列表
|
||||
private chunkSize: number; // 每批上传的条数
|
||||
private delay: number; // 每批上传之间的延迟时间(单位:毫秒)
|
||||
private uploadFunc: (chunk: T[], batchIndex: number, totalBatches: number) => Promise<void>; // 每一批次的上传函数
|
||||
private onComplete?: () => void; // 所有批次完成后的回调函数(可选)
|
||||
|
||||
/**
|
||||
* 构造函数,初始化批量上传器
|
||||
* @param options 配置参数
|
||||
*/
|
||||
constructor(options: {
|
||||
dataList: T[]; // 待上传的数据
|
||||
chunkSize?: number; // 每批数据大小(默认 8000)
|
||||
delay?: number; // 每批之间的延迟(默认 200ms)
|
||||
uploadFunc: (chunk: T[], batchIndex: number, totalBatches: number) => Promise<void>; // 上传逻辑函数
|
||||
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();
|
Reference in New Issue
Block a user