EventEmitter.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. export class EventEmitter {
  2. constructor() {
  3. // 用一个 map 来存放事件和事件回调
  4. this.events = new Map();
  5. }
  6. // 监听事件
  7. on(event, callback) {
  8. let callbacks = this.events.get(event); // 获取事件的回调函数列表
  9. // 如果不存在该事件的回调函数列表,则新建一个
  10. if (!callbacks) {
  11. callbacks = new Set();
  12. this.events.set(event, callbacks);
  13. }
  14. callbacks.add(callback); // 添加回调函数到列表中
  15. }
  16. // 取消监听事件
  17. off(event, callback) {
  18. const callbacks = this.events.get(event); // 获取事件的回调函数列表
  19. if (callbacks) {
  20. if (callback) {
  21. // 如果提供了回调函数,则删除指定的回调函数
  22. callbacks.delete(callback);
  23. } else {
  24. // 否则,将该事件的所有回调函数都删除
  25. this.events.delete(event);
  26. }
  27. }
  28. }
  29. // 触发事件
  30. emit(event, ...args) {
  31. const callbacks = this.events.get(event); // 获取事件的回调函数列表
  32. if (callbacks) {
  33. callbacks.forEach((callback) => {
  34. callback(...args); // 依次调用回调函数,并传递参数
  35. });
  36. }
  37. }
  38. // 绑定只执行一次的事件监听方法
  39. once(event, callback) {
  40. // 在一个匿名函数中包裹回调函数,用于在回调函数执行完毕后将其删除
  41. const onceWrapper = (...args) => {
  42. callback(...args);
  43. this.off(event, onceWrapper);
  44. };
  45. this.on(event, onceWrapper);
  46. }
  47. }