File size: 984 Bytes
1778c9e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
type AsyncQueueFunction<T> = () => Promise<T>;
interface QueueItem<T> {
asyncFunction: AsyncQueueFunction<T>;
resolve: (value: T | PromiseLike<T>) => void;
reject: (reason?: unknown) => void;
}
export class AsyncQueue<T> {
queue: QueueItem<T>[] = [];
private isProcessing = false;
public add(asyncFunction: AsyncQueueFunction<T>): Promise<T> {
return new Promise<T>((resolve, reject) => {
this.queue.push({ asyncFunction, resolve, reject });
this.processQueue();
});
}
private async processQueue(): Promise<void> {
if (this.isProcessing) {
return;
}
this.isProcessing = true;
while (this.queue.length > 0) {
const queueItem = this.queue.shift()!;
try {
const { asyncFunction, resolve } = queueItem;
const result = await asyncFunction();
resolve(result);
} catch (error) {
console.error("Error processing queue item:", error);
const { reject } = queueItem;
reject(error);
}
}
this.isProcessing = false;
}
}
|