queue.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /**
  2. * @author Toru Nagashima
  3. * @copyright 2016 Toru Nagashima. All rights reserved.
  4. * See LICENSE file in root directory for full license.
  5. */
  6. "use strict";
  7. var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
  8. var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
  9. var _createClass2 = require("babel-runtime/helpers/createClass");
  10. var _createClass3 = _interopRequireDefault(_createClass2);
  11. var _setImmediate2 = require("babel-runtime/core-js/set-immediate");
  12. var _setImmediate3 = _interopRequireDefault(_setImmediate2);
  13. var _symbol = require("babel-runtime/core-js/symbol");
  14. var _symbol2 = _interopRequireDefault(_symbol);
  15. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  16. var TAIL = (0, _symbol2.default)("tail");
  17. /**
  18. * Dequeue jobs.
  19. *
  20. * @param {Queue} queue - A job queue instance.
  21. * @param {object} item - The current job item.
  22. * @returns {void}
  23. */
  24. function dequeue(queue, item) {
  25. item.action(function () {
  26. if (item.next) {
  27. (0, _setImmediate3.default)(dequeue, queue, item.next);
  28. } else {
  29. queue[TAIL] = null;
  30. }
  31. });
  32. }
  33. /**
  34. * Job Queue.
  35. *
  36. * @private
  37. */
  38. module.exports = function () {
  39. /**
  40. * Constructor.
  41. */
  42. function Queue() {
  43. (0, _classCallCheck3.default)(this, Queue);
  44. this[TAIL] = null;
  45. }
  46. /**
  47. * Adds a job item into this queue.
  48. *
  49. * queue.push(done => {
  50. * // do something.
  51. * done();
  52. * });
  53. *
  54. * @param {function} action - The action of new job.
  55. * @returns {void}
  56. */
  57. (0, _createClass3.default)(Queue, [{
  58. key: "push",
  59. value: function push(action) {
  60. var item = { action: action, next: null };
  61. if (this[TAIL] != null) {
  62. this[TAIL] = this[TAIL].next = item;
  63. } else {
  64. this[TAIL] = item;
  65. (0, _setImmediate3.default)(dequeue, this, item);
  66. }
  67. }
  68. }]);
  69. return Queue;
  70. }();