Files
td_official/src/utils/batchUpload.ts

68 lines
2.0 KiB
TypeScript
Raw Normal View History

2025-05-27 19:53:19 +08:00
// 文件路径utils/BatchUploader.ts
/**
* BatchUploader
*
*
*/
2025-06-17 09:49:15 +08:00
/**
* BatchUploader
*
*/
2025-05-27 19:53:19 +08:00
export class BatchUploader<T> {
2025-06-17 09:49:15 +08:00
private dataList: T[];
private chunkSize: number;
private delay: number;
private uploadFunc: (chunk: T[], batchIndex: number, totalBatches: number) => Promise<void>;
private onComplete?: () => void;
2025-05-27 19:53:19 +08:00
constructor(options: {
2025-06-17 09:49:15 +08:00
dataList: T[]; // 统一使用一维数组类型
chunkSize?: number;
delay?: number;
uploadFunc: (chunk: T[], batchIndex: number, totalBatches: number) => Promise<void>;
onComplete?: () => void;
2025-05-27 19:53:19 +08:00
}) {
const { dataList, chunkSize = 8000, delay = 200, uploadFunc, onComplete } = options;
2025-06-17 09:49:15 +08:00
2025-05-27 19:53:19 +08:00
this.dataList = dataList;
this.chunkSize = chunkSize;
this.delay = delay;
this.uploadFunc = uploadFunc;
this.onComplete = onComplete;
}
public async start() {
2025-06-17 09:49:15 +08:00
const total = Math.ceil(this.dataList.length / this.chunkSize);
2025-05-27 19:53:19 +08:00
for (let i = 0; i < total; i++) {
const chunk = this.dataList.slice(i * this.chunkSize, (i + 1) * this.chunkSize);
2025-06-17 09:49:15 +08:00
console.log(`正在上传第 ${i + 1}/${total}chunk 大小: ${chunk.length}`);
2025-05-27 19:53:19 +08:00
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('桩点上传完成');
// }
// });
2025-06-17 09:49:15 +08:00
// await uploader.start();