TaskQueue.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. "use strict";
  2. var _promiseUtils = require("./promiseUtils");
  3. function _defineProperty(obj, key, value) {
  4. if (key in obj) {
  5. Object.defineProperty(obj, key, {
  6. value: value,
  7. enumerable: true,
  8. configurable: true,
  9. writable: true
  10. });
  11. } else {
  12. obj[key] = value;
  13. }
  14. return obj;
  15. }
  16. class TaskQueue {
  17. constructor() {
  18. _defineProperty(this, "queue", void 0);
  19. this.queue = [];
  20. }
  21. enqueue(task
  22. /*: () => Promise*/
  23. )
  24. /*: Promise*/
  25. {
  26. const taskComplete = new _promiseUtils.resolvingPromise();
  27. this.queue.push({
  28. task: task,
  29. _completion: taskComplete
  30. });
  31. if (this.queue.length === 1) {
  32. task().then(() => {
  33. this._dequeue();
  34. taskComplete.resolve();
  35. }, error => {
  36. this._dequeue();
  37. taskComplete.reject(error);
  38. });
  39. }
  40. return taskComplete;
  41. }
  42. _dequeue() {
  43. this.queue.shift();
  44. if (this.queue.length) {
  45. const next = this.queue[0];
  46. next.task().then(() => {
  47. this._dequeue();
  48. next._completion.resolve();
  49. }, error => {
  50. this._dequeue();
  51. next._completion.reject(error);
  52. });
  53. }
  54. }
  55. }
  56. module.exports = TaskQueue;