TaskQueue.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*:: type Task = {
  2. task: () => Promise;
  3. _completion: Promise
  4. };*/
  5. "use strict";
  6. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  7. var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
  8. var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
  9. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  10. /**
  11. * Copyright (c) 2015-present, Parse, LLC.
  12. * All rights reserved.
  13. *
  14. * This source code is licensed under the BSD-style license found in the
  15. * LICENSE file in the root directory of this source tree. An additional grant
  16. * of patent rights can be found in the PATENTS file in the same directory.
  17. *
  18. * @flow
  19. */
  20. var TaskQueue =
  21. /*#__PURE__*/
  22. function () {
  23. function TaskQueue() {
  24. (0, _classCallCheck2.default)(this, TaskQueue);
  25. (0, _defineProperty2.default)(this, "queue", void 0);
  26. this.queue = [];
  27. }
  28. (0, _createClass2.default)(TaskQueue, [{
  29. key: "enqueue",
  30. value: function (task
  31. /*: () => Promise*/
  32. )
  33. /*: Promise*/
  34. {
  35. var _this = this;
  36. var res;
  37. var rej;
  38. var taskComplete = new Promise(function (resolve, reject) {
  39. res = resolve;
  40. rej = reject;
  41. });
  42. taskComplete.resolve = res;
  43. taskComplete.reject = rej;
  44. this.queue.push({
  45. task: task,
  46. _completion: taskComplete
  47. });
  48. if (this.queue.length === 1) {
  49. task().then(function () {
  50. _this._dequeue();
  51. taskComplete.resolve();
  52. }, function (error) {
  53. _this._dequeue();
  54. taskComplete.reject(error);
  55. });
  56. }
  57. return taskComplete;
  58. }
  59. }, {
  60. key: "_dequeue",
  61. value: function () {
  62. var _this2 = this;
  63. this.queue.shift();
  64. if (this.queue.length) {
  65. var next = this.queue[0];
  66. next.task().then(function () {
  67. _this2._dequeue();
  68. next._completion.resolve();
  69. }, function (error) {
  70. _this2._dequeue();
  71. next._completion.reject(error);
  72. });
  73. }
  74. }
  75. }]);
  76. return TaskQueue;
  77. }();
  78. module.exports = TaskQueue;