TaskQueue.js 1.4 KB

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