Promise 事件监听器

826 阅读1分钟

实现一个promise事件监听器,实现如下功能

emitter.on('🦄', data => {
	console.log(data);
});

const myUnicorn = Symbol('🦄');

emitter.on(myUnicorn, data => {
	console.log(`Unicorns love ${data}`);
});

emitter.emit('🦄', '🌈'); // Will trigger printing '🌈'
emitter.emit(myUnicorn, '🦋');  // Will trigger printing 'Unicorns love 🦋'

1.实现上述功能


const eventsMap = new WeakMap();
let init = false;

function getListeners(instance, eventName) {
    const events = eventsMap.get(instance);
    if (!events.has(eventName)) {
        events.set(eventName, new Set());
    }

    return events.get(eventName);
}

export const emitter = {
    init() {
        if (!init) {
            eventsMap.set(this, new Map());
            init = true;
        }
    },
    on(eventName, listener) {
        getListeners(this, eventName).add(listener);
    },
    async emit(eventName, eventData) {
        const listeners = getListeners(this, eventName);
        const staticListeners = [...listeners];
        await Promise.all([
            ...staticListeners.map(async listener => {
                if (listeners.has(listener)) {
                    return listener(eventData);
                }
            }),
        ]);
    }
}

2.下面是调用

emitter.init();
const myUnicorn = Symbol('🦄');

emitter.on(myUnicorn, data => {
	console.log(`Unicorns love ${data}`);
});

emitter.emit(myUnicorn, '🦋');  // Will trigger printing 'Unicorns love 🦋'