type ITask = { data: any resolve: (result: any) => any waitTimer: any } /** 创建一个队列,每次添加一个数据,它会在队列满时会执行一次 onFull 方法,集中处理队列的数据。 * 而每次 push 时会返回一个 Promise,它会在函数真正执行后 resolve 并带回函数返回值。 */ export class PushQueue { queue: ITask[] = [] constructor( public onFull: (list: TData[]) => Promise, public options?: { fullSize?: number; maxWait?: number } ) {} /** 添加一个数据 */ pushOne(data: TData) { let { queue, options } = this let fullSize = options?.fullSize ?? 3 let maxWait = options?.maxWait ?? 2000 return new Promise((resolve) => { let waitTimer = setTimeout(() => { if (queue.length > 0) this.pullQueue() }, maxWait) let task = { data, resolve, waitTimer } queue.push(task) if (queue.length >= fullSize) { this.pullQueue() } }) } /** 执行队列中的全部任务 */ pullQueue() { let _queue = this.queue this.queue = [] _queue.forEach((task) => clearTimeout(task.waitTimer)) ;(async () => { let reList = await this.onFull(_queue.map((task) => task.data)) _queue.forEach(async (task, index) => task.resolve(reList?.[index])) })() } }