events-emitter.js 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /* eslint-disable no-underscore-dangle */
  2. export default {
  3. on(events, handler, priority) {
  4. const self = this;
  5. if (!self.eventsListeners || self.destroyed) return self;
  6. if (typeof handler !== 'function') return self;
  7. const method = priority ? 'unshift' : 'push';
  8. events.split(' ').forEach(event => {
  9. if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
  10. self.eventsListeners[event][method](handler);
  11. });
  12. return self;
  13. },
  14. once(events, handler, priority) {
  15. const self = this;
  16. if (!self.eventsListeners || self.destroyed) return self;
  17. if (typeof handler !== 'function') return self;
  18. function onceHandler(...args) {
  19. self.off(events, onceHandler);
  20. if (onceHandler.__emitterProxy) {
  21. delete onceHandler.__emitterProxy;
  22. }
  23. handler.apply(self, args);
  24. }
  25. onceHandler.__emitterProxy = handler;
  26. return self.on(events, onceHandler, priority);
  27. },
  28. onAny(handler, priority) {
  29. const self = this;
  30. if (!self.eventsListeners || self.destroyed) return self;
  31. if (typeof handler !== 'function') return self;
  32. const method = priority ? 'unshift' : 'push';
  33. if (self.eventsAnyListeners.indexOf(handler) < 0) {
  34. self.eventsAnyListeners[method](handler);
  35. }
  36. return self;
  37. },
  38. offAny(handler) {
  39. const self = this;
  40. if (!self.eventsListeners || self.destroyed) return self;
  41. if (!self.eventsAnyListeners) return self;
  42. const index = self.eventsAnyListeners.indexOf(handler);
  43. if (index >= 0) {
  44. self.eventsAnyListeners.splice(index, 1);
  45. }
  46. return self;
  47. },
  48. off(events, handler) {
  49. const self = this;
  50. if (!self.eventsListeners || self.destroyed) return self;
  51. if (!self.eventsListeners) return self;
  52. events.split(' ').forEach(event => {
  53. if (typeof handler === 'undefined') {
  54. self.eventsListeners[event] = [];
  55. } else if (self.eventsListeners[event]) {
  56. self.eventsListeners[event].forEach((eventHandler, index) => {
  57. if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
  58. self.eventsListeners[event].splice(index, 1);
  59. }
  60. });
  61. }
  62. });
  63. return self;
  64. },
  65. emit(...args) {
  66. const self = this;
  67. if (!self.eventsListeners || self.destroyed) return self;
  68. if (!self.eventsListeners) return self;
  69. let events;
  70. let data;
  71. let context;
  72. if (typeof args[0] === 'string' || Array.isArray(args[0])) {
  73. events = args[0];
  74. data = args.slice(1, args.length);
  75. context = self;
  76. } else {
  77. events = args[0].events;
  78. data = args[0].data;
  79. context = args[0].context || self;
  80. }
  81. data.unshift(context);
  82. const eventsArray = Array.isArray(events) ? events : events.split(' ');
  83. eventsArray.forEach(event => {
  84. if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
  85. self.eventsAnyListeners.forEach(eventHandler => {
  86. eventHandler.apply(context, [event, ...data]);
  87. });
  88. }
  89. if (self.eventsListeners && self.eventsListeners[event]) {
  90. self.eventsListeners[event].forEach(eventHandler => {
  91. eventHandler.apply(context, data);
  92. });
  93. }
  94. });
  95. return self;
  96. }
  97. };