TaskQueue.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*:: type Task = {
  2. task: () => Promise;
  3. _completion: Promise
  4. };*/
  5. /**
  6. * Copyright (c) 2015-present, Parse, LLC.
  7. * All rights reserved.
  8. *
  9. * This source code is licensed under the BSD-style license found in the
  10. * LICENSE file in the root directory of this source tree. An additional grant
  11. * of patent rights can be found in the PATENTS file in the same directory.
  12. *
  13. * @flow
  14. */
  15. class TaskQueue {
  16. /*:: queue: Array<Task>;*/
  17. constructor() {
  18. this.queue = [];
  19. }
  20. enqueue(task
  21. /*: () => Promise*/
  22. )
  23. /*: Promise*/
  24. {
  25. let res;
  26. let rej;
  27. const taskComplete = new Promise((resolve, reject) => {
  28. res = resolve;
  29. rej = reject;
  30. });
  31. taskComplete.resolve = res;
  32. taskComplete.reject = rej;
  33. this.queue.push({
  34. task: task,
  35. _completion: taskComplete
  36. });
  37. if (this.queue.length === 1) {
  38. task().then(() => {
  39. this._dequeue();
  40. taskComplete.resolve();
  41. }, error => {
  42. this._dequeue();
  43. taskComplete.reject(error);
  44. });
  45. }
  46. return taskComplete;
  47. }
  48. _dequeue() {
  49. this.queue.shift();
  50. if (this.queue.length) {
  51. const next = this.queue[0];
  52. next.task().then(() => {
  53. this._dequeue();
  54. next._completion.resolve();
  55. }, error => {
  56. this._dequeue();
  57. next._completion.reject(error);
  58. });
  59. }
  60. }
  61. }
  62. module.exports = TaskQueue;