TaskQueue.js 1.2 KB

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