EventBus

103 阅读1分钟

发布订阅

Edit determined-brattain-f0exv

type TFn = (data?: unknown) => void;

interface IEvents {
  [key: string]: TFn[];
}

class EventBus {
  events: IEvents = {};
  /**
   *
   */
  on(key: string, fn: TFn) {
    if(!this.events[key]) this.events[key] = []
    this.events[key].push(fn);
  }
  /**
   *
   */
  emit(key: string, data?: unknown) {
    (this.events[key] || []).forEach((fn) => fn(data));
  }
  /**
   *
   */
  off(key: string, fn: TFn) {
    this.events[key] = this.events[key] || [];
    const index = this.events[key].indexOf(fn);
    if (index === -1) return;
    this.events[key].splice(index, 1);
  }
}

export default EventBus;

class EventBus {
  events = {};
  /**
   *
   */
  on(key, fn) {
    if(!this.events[key]) this.events[key] = []
    this.events[key].push(fn);
    // 取消订阅
    return () => {
      const index = this.events[key].indexOf(fn);
      this.events[key].splice(index, 1);
    }
  }
  /**
   *
   */
  emit(key, data) {
    (this.events[key] || []).forEach((fn) => fn(data));
  }
}

export default EventBus;

测试代码


type TestCase = (message: string) => void;

const test1: TestCase = (message) => {
  const eventHub = new EventBus();
  console.assert(eventHub instanceof Object === true, "eventHub 是个对象");
  console.log(message);
};

const test2: TestCase = (message) => {
  const eventHub = new EventBus();
  // on emit
  let called = false;
  eventHub.on("xxx", (y) => {
    called = true;
    console.assert(y[0] === "今天林志玲结婚了");
    console.assert(y[1] === "言承旭无话可说");
  });
  eventHub.emit("xxx", ["今天林志玲结婚了", "言承旭无话可说"]);
  console.assert(called);
  console.log(message);
};

const test3: TestCase = (message) => {
  const eventHub = new EventBus();
  let called = false;
  const fn1 = () => {
    called = true;
  };

  eventHub.on("yyy", fn1);
  eventHub.off("yyy", fn1);
  eventHub.emit("yyy");
  console.assert(called === false);
  console.log(message);
};

function testRun() {
  test1("EventBus 可以创建对象");
  test2(".on 了之后 .emit,会触发 .on 的函数");
  test3(".off 有用");
}

testRun()