发布订阅
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()