Files
td_official/src/utils/batchUpload.ts

73 lines
2.5 KiB
TypeScript
Raw Normal View History

2025-05-27 19:53:19 +08:00
// 文件路径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();