实现一个EventBus,实现如下功能
const myUnicorn = Symbol('🦄');
EventBus.subscribe(myUnicorn, (_, data) => {
console.log(`Unicorns love ${data}`);
});
EventBus.publish(myUnicorn, '🦋');
实现代码如下
export type Subscriber = (event: Symbol, ...args: readonly any[]) => void;
export type UnSubscriber = () => void;
const subscriptions: Map<Symbol, Subscriber[]> = new Map();
const EventBus = {
subscribe(event: Symbol, subscriber: Subscriber) {
let subscribers = subscriptions.get(event);
if (!subscribers) {
subscribers = [];
subscriptions.set(event, subscribers);
}
subscribers.push(subscriber);
},
unSubscribe(event: Symbol, subscriber: Subscriber) {
const subscribers = subscriptions.get(event);
subscribers?.splice(subscribers?.indexOf(subscriber), 1);
},
hasSubscribers(event: Symbol) {
const subscribers = subscriptions.get(event);
return subscribers && subscribers.length > 0;
},
publish(event: Symbol, ...args: readonly any[]) {
subscriptions.get(event)?.forEach(subscriber => subscriber(event, args));
}
};
export default EventBus;
可以和我的之前一篇文章Promise事件监听器对比查看,相信你会收获会更多!
如果你有收获,请不要吝啬你的赞👍!