实现一个promise事件监听器,实现如下功能
emitter.on('🦄', data => {
console.log(data);
});
const myUnicorn = Symbol('🦄');
emitter.on(myUnicorn, data => {
console.log(`Unicorns love ${data}`);
});
emitter.emit('🦄', '🌈');
emitter.emit(myUnicorn, '🦋');
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, '🦋')