MessageMgr.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. class Listener{
  2. //关注的消息
  3. private _event: string = '';
  4. //消息对应的事件
  5. private _callback: Function = null;
  6. //回调函数的this指向
  7. private _callTarget: any = null;
  8. constructor(ev: string, callback: Function, target: any = null){
  9. this._event = ev;
  10. this._callback = callback;
  11. this._callTarget = target;
  12. }
  13. hasCallBack(func: Function){
  14. return this._callback === func;
  15. }
  16. callback(...args){
  17. this._callback.apply(this._callTarget,[...args]);
  18. }
  19. }
  20. class MessageMgr{
  21. static instance: MessageMgr = null;
  22. //考虑多个观察者 关注同一个消息的情况
  23. private _listeners: Map<string, Listener[]> = new Map();
  24. //注册消息
  25. addEvent(ev: string, callback: Function, target: any = null){
  26. const lis: Listener = new Listener(ev, callback, target);
  27. if(this._listeners.has(ev)){
  28. //如果消息已经被某个观察者关注了 那么找到那个数组 把新的观察者也存进去
  29. this._listeners.get(ev).push(lis);
  30. return;
  31. }
  32. //把消息和观察者对应存储
  33. //先创建一个Listener类型的数组
  34. const liss: Listener[] = [];
  35. //把第一个对应ev的观察者存储起来
  36. liss.push(lis);
  37. //把消息和存listener的数组 存到map 中
  38. this._listeners.set(ev, liss);
  39. }
  40. //激活消息
  41. dispatch(event: string, ...args){
  42. this._listeners.forEach((liss: Listener[], ev: string)=>{
  43. //遍历整个map 判断传递进来的消息 是否和某个键值对的键 相同
  44. if(event === ev){
  45. for(const lis of liss){
  46. lis.callback(...args);
  47. }
  48. }
  49. })
  50. }
  51. //移除事件
  52. removeEvent(event: string | Function){
  53. if(typeof(event) === "string"){
  54. this._listeners.delete(event);
  55. return;
  56. }
  57. for(const liss of Array.from(this._listeners.values())){
  58. for(let i = 0; i < liss.length; i++){
  59. if(liss[i].hasCallBack(event)){
  60. liss.splice(i , 1);
  61. return;
  62. }
  63. }
  64. }
  65. }
  66. //移除所有事件
  67. removeAll(){
  68. this._listeners.clear();
  69. }
  70. }
  71. export const messageMgr: MessageMgr = MessageMgr.instance = new MessageMgr();