TaskQueue.js 1006 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. "use strict";
  2. var _promiseUtils = require("./promiseUtils");
  3. /**
  4. * @flow
  5. */
  6. /*:: type Task = {
  7. task: () => Promise,
  8. _completion: Promise,
  9. };*/
  10. class TaskQueue {
  11. /*:: queue: Array<Task>;*/
  12. constructor() {
  13. this.queue = [];
  14. }
  15. enqueue(task /*: () => Promise*/) /*: Promise*/{
  16. const taskComplete = new _promiseUtils.resolvingPromise();
  17. this.queue.push({
  18. task: task,
  19. _completion: taskComplete
  20. });
  21. if (this.queue.length === 1) {
  22. task().then(() => {
  23. this._dequeue();
  24. taskComplete.resolve();
  25. }, error => {
  26. this._dequeue();
  27. taskComplete.reject(error);
  28. });
  29. }
  30. return taskComplete;
  31. }
  32. _dequeue() {
  33. this.queue.shift();
  34. if (this.queue.length) {
  35. const next = this.queue[0];
  36. next.task().then(() => {
  37. this._dequeue();
  38. next._completion.resolve();
  39. }, error => {
  40. this._dequeue();
  41. next._completion.reject(error);
  42. });
  43. }
  44. }
  45. }
  46. module.exports = TaskQueue;