baseDispatcher.js

  1. define(['utils', 'IPlugin'], function(Utils, IPlugin) {
  2. "use strict";
  3. //todo может например перейти на https://github.com/component/emitter
  4. /**
  5. * @class
  6. * Класс диспетчера, инкапсулирует событийную модель, каждый экземпляр представляет собой событие.
  7. * @param {JQuery} mainDiv - элемент, в котором располагается панель. Должен содержать класс rb-wrapper.
  8. * @constructor BaseDispatcher
  9. * @extends IPlugin
  10. */
  11. function BaseDispatcher(mainDiv) {
  12. this._actions = {};
  13. this._index = 0;
  14. this._mainDiv = mainDiv;
  15. }
  16. Utils.inherite(BaseDispatcher, IPlugin);
  17. BaseDispatcher.prototype.configure = function(config) {
  18. if (typeof config === 'object') {
  19. if (config.loadingDiv !== undefined) {
  20. this._loadingDiv = $(config.loadingDiv);
  21. }
  22. }
  23. };
  24. // todo сделать не once, а дать возможность указать число - количество срабатываний,
  25. // или функцию которая если вернет true - не отписываться, false - отписываться
  26. /**
  27. * Зарегистрировать действие, которое выполнится при запуске действий
  28. * @param {function} action - регистрируемое действие
  29. * @param {boolean} [once] - выполнить действие только в первый раз
  30. * @returns {number|null} индекс зарегистрированного действия (null, если действие не было зарегистрировано)
  31. * @memberOf BaseDispatcher
  32. */
  33. BaseDispatcher.prototype.add = function(action, once) {
  34. if (typeof action === 'function') {
  35. this._actions[this._index++] = {
  36. action: action,
  37. once: once
  38. };
  39. return this._index-1;
  40. }
  41. return null;
  42. };
  43. // todo отписка не по индексу, а по функции
  44. /**
  45. * Удалить действие из списка зарегистрированных действий
  46. * @param {number} index - индекс удаляемого действия
  47. * @memberOf BaseDispatcher
  48. */
  49. BaseDispatcher.prototype.remove = function(index) {
  50. if (this._actions.hasOwnProperty(index)) {
  51. delete this._actions[index];
  52. }
  53. };
  54. /**
  55. * Запустить зарегистрированные действия
  56. * @param {function|undefined} [fn] - функция, которая будет выполнена после того, как выполнятся все зарегистрированные действия.
  57. * Если зарегистрированные функции возвращают Promise, функция выполнится после завершения этих Promise.
  58. * Если хотя бы одна из зарегистрированных функций (или их Promise) вернет false, фунция fn не будет вызвана.
  59. * @param {Array} [actionArgs] - аргументы для зарегистрированных функций (для всех функций будут переданы одни и те же аргументы).
  60. * @returns {*} Результат выполнения функции fn, либо undefined если функция fn не была вызвана
  61. * @memberOf BaseDispatcher
  62. */
  63. BaseDispatcher.prototype.runActions = function(fn, actionArgs) {
  64. var
  65. actions = [],
  66. results = [],
  67. self = this;
  68. if (Object.keys(this._actions).length) {
  69. this._mainDiv.append(this._loadingDiv); // todo вынести это в moving, а здесь просто вызывать функцию
  70. Object.keys(this._actions).map(function(index) {
  71. var value = this._actions[index],
  72. result = value.action.apply(undefined, actionArgs);
  73. if (value.once) {
  74. this.remove(index);
  75. }
  76. if (result instanceof Promise) {
  77. actions.push(result);
  78. } else {
  79. results.push(result);
  80. }
  81. }.bind(this));
  82. return Promise.all(actions).then(function(promiseResult) {
  83. self._loadingDiv.remove();
  84. var isOk = results.concat(promiseResult).every(function(res) {
  85. return res !== false;
  86. });
  87. if (isOk) {
  88. return fn && fn();
  89. }
  90. }, function(error) {
  91. self._loadingDiv.remove();
  92. console.error(error);
  93. var isOk = results.every(function(res) {
  94. return res !== false;
  95. });
  96. if (isOk) {
  97. return fn && fn();
  98. }
  99. });
  100. } else {
  101. return fn && fn();
  102. }
  103. };
  104. /**
  105. * Уничтожить экземпляр класса
  106. * @memberOf BaseDispatcher
  107. */
  108. BaseDispatcher.prototype.destroy = function() {
  109. this._actions = null;
  110. };
  111. return BaseDispatcher;
  112. });