useEventEmitter.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /**
  2. * @method useEventEmitter 事件监听发射器
  3. * @return {Object} 返回一组事件绑定的函数
  4. * @property addListener {Function} 添加特定事件监听器
  5. * @property removeListener {Function} 移除事件监听器
  6. * @property emit {Function} 触发特定事件,并依次调用与该事件关联的所有监听器函数
  7. * @property addOnceListener {Function} 添加一次特定事件监听器
  8. * @property removeAllListeners {Function} 移除所有特定事件监听器
  9. * @property getListeners {Function} 获取所有特定事件监听器
  10. * */
  11. const useEventEmitter = ()=>{
  12. let events = {};
  13. return {
  14. /**
  15. * @method addListener 添加特定事件监听器
  16. * @param eventName {String} 事件名
  17. * @param listener {Function} 监听函数
  18. * */
  19. addListener(eventName, listener) {
  20. if (!events[eventName]) {
  21. events[eventName] = [];
  22. }
  23. events[eventName].push(listener);
  24. },
  25. /**
  26. * @method addOnceListener 添加一次特定事件监听器
  27. * @param eventName {String} 事件名
  28. * @param listener {Function} 监听函数
  29. * */
  30. addOnceListener(eventName, listener) {
  31. const onceListener = (...args) => {
  32. this.removeListener(eventName, onceListener);
  33. listener.apply(null, args);
  34. };
  35. this.addListener(eventName, onceListener);
  36. },
  37. /**
  38. * @method removeListener 移除事件监听器
  39. * @param eventName {String} 事件名
  40. * @param listener {Function} 事件监听器函数
  41. * */
  42. removeListener(eventName, listener) {
  43. const eventCallbacks = events[eventName];
  44. if (eventCallbacks) {
  45. events[eventName] = events[eventName].filter(
  46. (eventListener) => eventListener !== listener
  47. );
  48. }
  49. },
  50. /**
  51. * @method emit 触发特定事件,并依次调用与该事件关联的所有监听器函数
  52. * @param eventName {String} 事件名
  53. * @param args 传给监听事件的参数
  54. * */
  55. emit(eventName, ...args) {
  56. const eventCallbacks = events[eventName];
  57. if (eventCallbacks) {
  58. eventCallbacks.forEach(callback => {
  59. callback.apply(null, args);
  60. });
  61. }
  62. },
  63. /**
  64. * @method addOnceListener 移除所有特定事件监听器
  65. * @param eventName {String} 事件名
  66. * */
  67. removeAllListeners(eventName) {
  68. const eventCallbacks = events[eventName];
  69. if (eventCallbacks) {
  70. delete events[eventName];
  71. }
  72. },
  73. /**
  74. * @method getListeners 获取所有特定事件监听器
  75. * @param eventName {String} 事件名
  76. * */
  77. getListeners(eventName) {
  78. return events[eventName] || [];
  79. }
  80. }
  81. };
  82. export default useEventEmitter