index.ts 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { v4 } from 'uuid'
  2. /**
  3. * 事件消息
  4. */
  5. interface EventMessage {
  6. keys: (keyof typeof EventKey)[];
  7. callback: (data: unknown) => void;
  8. }
  9. /** 事件key */
  10. enum EventKey {
  11. loadComplete, //加载状态名
  12. spotTrade, // 挂牌成功,通知报价大厅更新数据
  13. blocsTrade, // 贸易圈 挂牌成功
  14. financing_manager, // 融资摘牌
  15. changeTheme, // 切换主题
  16. logout, //登出名:确认登出时不能进行其它操作了 暂时1s登出状态
  17. loginSuccess, // 登录成功
  18. loadAddressList, //加载地址列表
  19. loadMylieList, //加载闲置列表
  20. marketStatusChangeNtf, // 市场状态变更通知
  21. custOfflineNtf, //接收到账户离线通知
  22. userLogout, //接收到用户登出应答
  23. posChangedNtf, //接收到头寸变化通知
  24. moneyChangedNtf, //接收到资金变化通知
  25. taAccountChangedNtf, //接收到资金账户通知
  26. bargain, // 议价单
  27. orderCanceledNtf, //接收到委托单撤单通知
  28. orderDealedNtf, //接收到委托单成交通知
  29. quoteReceiveNtf, // 接收实时行情推送
  30. wrTradeDealedNtf, // 接收到仓单贸易成交通知
  31. }
  32. /**
  33. * 事件总线
  34. */
  35. export default new (class {
  36. private eventMap = new Map<string, EventMessage>();
  37. /** 监听(订阅)事件 */
  38. $on(eventKey: keyof typeof EventKey | (keyof typeof EventKey)[], callback: EventMessage['callback']) {
  39. const uuid = v4();
  40. const keys = Array.isArray(eventKey) ? eventKey : [eventKey];
  41. this.eventMap.set(uuid, {
  42. keys,
  43. callback
  44. })
  45. /** 销毁事件,注意离开页面时要手动销毁当前页面的监听事件,防止事件重复触发 */
  46. return () => {
  47. this.eventMap.delete(uuid);
  48. }
  49. }
  50. /** 触发(发布)事件 */
  51. $emit(eventKey: keyof typeof EventKey, data?: unknown) {
  52. for (const message of this.eventMap.values()) {
  53. if (message.keys.includes(eventKey)) {
  54. message.callback(data);
  55. }
  56. }
  57. }
  58. /** 取消事件 */
  59. $off(...eventkeys: (keyof typeof EventKey)[]) {
  60. if (eventkeys.length) {
  61. for (const [uuid, message] of this.eventMap.entries()) {
  62. for (let i = message.keys.length - 1; i >= 0; i--) {
  63. if (eventkeys.includes(message.keys[i])) {
  64. message.keys.splice(i, 1);
  65. }
  66. }
  67. if (!message.keys.length) {
  68. this.eventMap.delete(uuid);
  69. }
  70. }
  71. } else {
  72. this.eventMap.clear();
  73. }
  74. }
  75. })