LockQueue.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. class LockQueue {
  2. constructor(queueSize = 100) {
  3. this.queueSize = queueSize;
  4. this.freed = true;
  5. this.waitingQueue = [];
  6. }
  7. //async
  8. get(take = true) {
  9. return new Promise((resolve, reject) => {
  10. if (this.freed) {
  11. if (take)
  12. this.freed = false;
  13. resolve();
  14. return;
  15. }
  16. if (this.waitingQueue.length < this.queueSize) {
  17. this.waitingQueue.push({resolve, reject});
  18. } else {
  19. reject(new Error('Lock queue is too long'));
  20. }
  21. });
  22. }
  23. ret() {
  24. if (this.waitingQueue.length) {
  25. this.waitingQueue.shift().resolve();
  26. } else {
  27. this.freed = true;
  28. }
  29. }
  30. //async
  31. wait() {
  32. return this.get(false);
  33. }
  34. retAll() {
  35. while (this.waitingQueue.length) {
  36. this.waitingQueue.shift().resolve();
  37. }
  38. }
  39. errAll(error = 'rejected') {
  40. while (this.waitingQueue.length) {
  41. this.waitingQueue.shift().reject(new Error(error));
  42. }
  43. }
  44. }
  45. module.exports = LockQueue;