dsQueue.js 1015 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. class DsQueue {
  2. constructor(concurrency = 1) {
  3. this.concurrency = concurrency;
  4. this.queue = [];
  5. this.activeCount = 0;
  6. }
  7. async runTask(task) {
  8. this.activeCount++;
  9. try {
  10. await task();
  11. } catch (err) {
  12. console.log('Task failed:', err);
  13. } finally {
  14. this.activeCount--;
  15. this.next();
  16. }
  17. }
  18. next() {
  19. if (this.queue.length > 0 && this.activeCount < this.concurrency) {
  20. const nextTask = this.queue.shift();
  21. this.runTask(nextTask);
  22. }
  23. }
  24. add(task) {
  25. this.queue.push(task);
  26. this.next();
  27. }
  28. onIdle() {
  29. return new Promise((resolve) => {
  30. const interval = setInterval(() => {
  31. if (this.queue.length === 0 && this.activeCount === 0) {
  32. clearInterval(interval);
  33. resolve();
  34. }
  35. }, 10);
  36. });
  37. }
  38. }
  39. export default DsQueue;