events-emitter.js 2.9 KB

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