async_queue.ts 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { Log } from '$app/utils/log';
  2. export class AsyncQueue<T> {
  3. private queue: T[] = [];
  4. private isProcessing = false;
  5. private executeFunction: (item: T) => Promise<void>;
  6. constructor(executeFunction: (item: T) => Promise<void>) {
  7. this.executeFunction = executeFunction;
  8. }
  9. enqueue(item: T): void {
  10. this.queue.push(item);
  11. this.processQueue();
  12. }
  13. private processQueue(): void {
  14. if (this.isProcessing || this.queue.length === 0) {
  15. return;
  16. }
  17. const item = this.queue.shift();
  18. this.isProcessing = true;
  19. const executeFn = async (item: T) => {
  20. try {
  21. await this.processItem(item);
  22. } catch (error) {
  23. Log.error('queue processing error:', error);
  24. } finally {
  25. this.isProcessing = false;
  26. this.processQueue();
  27. }
  28. };
  29. executeFn(item!);
  30. }
  31. private async processItem(item: T): Promise<void> {
  32. try {
  33. await this.executeFunction(item);
  34. } catch (error) {
  35. Log.error('queue processing error:', error);
  36. }
  37. }
  38. }