EventBus.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. class EventBus {
  2. constructor() {
  3. this.eventObject = {};
  4. this.callbackId = 0;
  5. this.state = {}
  6. // console.log("eventBus初始化了")
  7. }
  8. // 发布事件
  9. publish(eventName, ...args) {
  10. // console.log("发布事件", eventName, ...args);
  11. this.state[eventName] = args.length === 1 ? args[0] : args;
  12. // 取出当前事件所有的回调函数
  13. const callbackObject = this.eventObject[eventName];
  14. if (!callbackObject) return console.warn(eventName + " not found!");
  15. // 执行每一个回调函数
  16. for (let id in callbackObject) {
  17. // 执行时传入参数
  18. // console.log("准备执行回调", id); // 确认回调即将执行
  19. callbackObject[id](...args);
  20. // console.log("回调执行完毕", id); // 确认回调执行完毕
  21. // 只订阅一次的回调函数需要删除
  22. if (id[0] === "d") {
  23. delete callbackObject[id];
  24. }
  25. }
  26. }
  27. // 订阅事件
  28. subscribe(eventName, callback) {
  29. // console.log("订阅事件", eventName, callback);
  30. // 初始化这个事件
  31. if (!this.eventObject[eventName]) {
  32. // 使用对象存储,注销回调函数的时候提高删除的效率
  33. this.eventObject[eventName] = {};
  34. }
  35. const id = this.callbackId;
  36. this.callbackId++; // 确保每次调用后递增
  37. // 存储订阅者的回调函数
  38. // callbackId使用后需要自增,供下一个回调函数使用
  39. this.eventObject[eventName][id] = callback;
  40. // console.log("回调ID分配:", id); // 查看ID
  41. // 每一次订阅事件,都生成唯一一个取消订阅的函数
  42. const unSubscribe = () => {
  43. // 清除这个订阅者的回调函数
  44. delete this.eventObject[eventName][id];
  45. // 如果这个事件没有订阅者了,也把整个事件对象清除
  46. if (Object.keys(this.eventObject[eventName]).length === 0) {
  47. delete this.eventObject[eventName];
  48. }
  49. };
  50. return { unSubscribe };
  51. }
  52. // 只订阅一次
  53. subscribeOnce(eventName, callback) {
  54. // 初始化这个事件
  55. if (!this.eventObject[eventName]) {
  56. // 使用对象存储,注销回调函数的时候提高删除的效率
  57. this.eventObject[eventName] = {};
  58. }
  59. // 标示为只订阅一次的回调函数
  60. const id = "d" + this.callbackId++;
  61. // 存储订阅者的回调函数
  62. // callbackId使用后需要自增,供下一个回调函数使用
  63. this.eventObject[eventName][id] = callback;
  64. // 每一次订阅事件,都生成唯一一个取消订阅的函数
  65. const unSubscribe = () => {
  66. // 清除这个订阅者的回调函数
  67. delete this.eventObject[eventName][id];
  68. // 如果这个事件没有订阅者了,也把整个事件对象清除
  69. if (Object.keys(this.eventObject[eventName]).length === 0) {
  70. delete this.eventObject[eventName];
  71. }
  72. };
  73. return { unSubscribe };
  74. }
  75. // 获取状态的新方法
  76. getState(eventName) {
  77. return this.state[eventName];
  78. }
  79. // 清除事件
  80. clear(eventName) {
  81. // 未提供事件名称,默认清除所有事件
  82. if (!eventName) {
  83. this.eventObject = {};
  84. this.state = {};
  85. return;
  86. }
  87. // 清除指定事件
  88. delete this.eventObject[eventName];
  89. delete this.state[eventName];
  90. }
  91. }
  92. if (!window.sharedEventBus) {
  93. window.sharedEventBus = new EventBus();
  94. window.sharedEventBus.publish('folderPath', []);
  95. }
  96. export const eventBus = window.sharedEventBus;
  97. export const EVEN_VAR = {
  98. // 系统编辑模式变化
  99. systemEditModelChange: "systemEditModelChange",
  100. // 显示项目弹窗
  101. showProjectDialog: "showProjectDialog",
  102. showKnowledgeDialog: "KnowledgeDialog",
  103. showOrcDialog: "showOrcDialog",
  104. showOrcListDialog: "showOrcListDialog",
  105. showZhibiaoNodeDialog: "showZhibiaoNodeDialog",
  106. showVerifyDialog: "showVerifyDialog",
  107. showGlobalSearchDialog: "showGlobalSearchDialog",
  108. // 1.2.2录入页校验
  109. showAddUserInfoDialog: "showAddUserInfoDialog",
  110. // 1.5.2.新增工作节点
  111. showAddWorkNodeDialog: "showAddWorkNodeDialog",
  112. // 知识库变动01
  113. showKnowlegeDbViewerDialog: "showKnowlegeDbViewerDialog",
  114. showKnowlegeDbChangeDialog: "showKnowlegeDbChangeDialog",
  115. // 编辑器
  116. showEditorDialog: "showEditorDialog",
  117. // 添加预警窗口
  118. showAddWaringDialog: "showAddWaringDialog",
  119. // 空窗口
  120. showEmptyDialog: "showEmptyDialog",
  121. currentPage:"index.html",
  122. };