EventEmitter.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Simple event emitter implementation, but has a slightly unusual API for
  2. // removing specific listeners. If a specific listener needs to be removed
  3. // (instead of all listeners), then it needs to use a "namespace":
  4. // Create a listener on the foo event with bar namespace: .on 'foo.bar'
  5. // Trigger all events for the foo event (including namespaces): .trigger 'foo'
  6. // Remove all listeners for the foo event (including namespaces): .off 'foo'
  7. // Remove a listener for the foo event with the bar namespace: .off 'foo.bar'
  8. export default class EventEmitter {
  9. constructor() {
  10. this.events = {}
  11. }
  12. on(event, callback) {
  13. if (!this.events) {
  14. this.events = {}
  15. }
  16. let namespace
  17. ;[event, namespace] = Array.from(event.split('.'))
  18. if (!this.events[event]) {
  19. this.events[event] = []
  20. }
  21. this.events[event].push({
  22. callback,
  23. namespace,
  24. })
  25. }
  26. off(event, cb) {
  27. if (!this.events) {
  28. this.events = {}
  29. }
  30. if (event) {
  31. let namespace
  32. ;[event, namespace] = event.split('.')
  33. if (!this.events[event]) {
  34. this.events[event] = []
  35. }
  36. if (cb) {
  37. this.events[event] = this.events[event].filter(e => e.callback !== cb)
  38. } else if (!namespace) {
  39. // Clear all listeners for event
  40. delete this.events[event]
  41. } else {
  42. // Clear only namespaced listeners
  43. this.events[event] = this.events[event].filter(
  44. e => e.namespace !== namespace
  45. )
  46. }
  47. } else {
  48. // Remove all listeners
  49. this.events = {}
  50. }
  51. }
  52. trigger(event, ...args) {
  53. if (!this.events) {
  54. this.events = {}
  55. }
  56. if (this.events[event]) {
  57. this.events[event].forEach(e => e.callback(...args))
  58. }
  59. }
  60. emit(...args) {
  61. this.trigger(...args)
  62. }
  63. }