EventBus订阅发布

666 阅读1分钟

实现一个EventBus,实现如下功能

const myUnicorn = Symbol('🦄');

EventBus.subscribe(myUnicorn, (_, data) => {
	console.log(`Unicorns love ${data}`);
});

EventBus.publish(myUnicorn, '🦋');  // Will trigger printing 'Unicorns love 🦋'

实现代码如下

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事件监听器对比查看,相信你会收获会更多!

如果你有收获,请不要吝啬你的赞👍!