Advertisement
Guest User

Untitled

a guest
Sep 21st, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 KB | None | 0 0
  1. function EE() {
  2. if (!(this instanceof EE))
  3. throw new Error("EE should be called with new operator");
  4. this.listeners = {};
  5. }
  6.  
  7. EE.prototype.on = function _on(event, callback, ctx) {
  8. return on(this, event, callback, ctx, false);
  9. };
  10.  
  11. EE.prototype.once = function _once(event, callback, ctx) {
  12. return on(this, event, callback, ctx, true);
  13. };
  14.  
  15. EE.prototype.off = function _off(event, callback) {
  16. return off(this, event, callback);
  17. };
  18.  
  19. EE.prototype.emit = function _emit() {
  20. return emit.apply(null, [this].concat(Array.prototype.slice.call(arguments)));
  21. };
  22.  
  23. function on(self, event, callback, ctx, once) {
  24. let listener = self.listeners[event] || (self.listeners[event] = []);
  25.  
  26. listener.push({
  27. ctx,
  28. fn: callback,
  29. once: !!once
  30. });
  31. return self;
  32. }
  33.  
  34. function off(self, event, callback) {
  35. let listener = self.listeners[event];
  36. if (!listener) {
  37. return false;
  38. }
  39. let flag;
  40. for (let i = 0; i < listener.length; ) {
  41. const item = listener[i];
  42. if (item.fn === callback) {
  43. flag = flag || true;
  44. listener.splice(i, 1);
  45. } else {
  46. i++;
  47. }
  48. }
  49. if (listener.length === 0) {
  50. delete self.listeners[event];
  51. }
  52. return flag;
  53. }
  54.  
  55. function emit(self, event) {
  56. if (!self.listeners[event]) {
  57. return false;
  58. }
  59. const listener = self.listeners[event].slice();
  60. const payload = Array.prototype.slice.call(arguments, 2);
  61.  
  62. for (let i = 0; i < listener.length; i++) {
  63. const item = listener[i];
  64. const fn = item.fn;
  65. if (item.once && self.listeners[event].indexOf(item) > -1) {
  66. self.listeners[event].splice(self.listeners[event].indexOf(item), 1);
  67. }
  68. if (item.ctx !== undefined) {
  69. fn.apply(item.ctx, payload);
  70. } else {
  71. fn.apply(void 0, payload);
  72. }
  73. }
  74. if (self.listeners[event].length === 0) {
  75. delete self.listeners[event];
  76. }
  77. return true;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement