Javascript 使用多种方法实现事件管理器
实现EventManager类Javascript 使用多种方法实现事件管理器,javascript,node.js,Javascript,Node.js,实现EventManager类 推送(事件:字符串,方法:函数) 删除(事件:字符串,方法:函数) 打印(事件:字符串,数据:somedata) 我的想法是使用new Map()来解决死胡同循环问题,Map的 键为事件类型,值为函数列表 按-将函数添加到列表中 移除-从列表中移除该函数 打印-使用事件类型从映射中获取列表,数据调用函数 我不知道如何实现“print”方法,我也不确定是否需要使用回调函数来解决这个问题? 也不确定我的“推”和“删除”是否在正确的轨道上你很接近了(不是真的) 类事件
类事件管理器{
构造函数(){
this.events={};
}
订阅(事件、回调){
const map=this.events[event]=this.events[event]| |新映射;
if(回调类型==='function'){
map.set(回调);
}
}
发布(事件、数据){
const map=this.events[event];
如果(地图){
[…map].forEach(([cb])=>cb(数据));
}
}
取消订阅(事件、回调){
const map=this.events[event];
如果(地图){
map.delete(回调);
}
}
}
通道=新事件管理器;
const callback1=data=>console.log('callback1:',data);
const callback2=data=>console.log('callback2:',data);
const callback3=data=>console.log('callback3:',data);
channel.subscribe('request.error',callback1);
channel.subscribe('request.error',callback2);
channel.subscribe('request.success',callback3);
channel.publish('request.error',{foo:'bar'});
channel.publish('request.success',{lorem:'ipsum'});
//控制台中的预期输出:
//
//回调1:{foo:'bar'}
//回调2:{foo:'bar'}
//回调3:{lorem:'ipsum'}
频道取消订阅('request.error',callback1);
channel.publish('request.error',{bar:'baz'});
//控制台中的预期输出:
//
//回调2:{bar:'baz'}
到目前为止您尝试过什么吗?StackOverflow不是一个免费的代码编写服务,它希望您能够这样做。请更新您的问题,以显示您已经尝试过的内容,并显示您在某个问题中面临的具体问题。欲了解更多信息,请参阅,顺便说一句,仍然有一个问题,这个“[…map].forEach(([cb])=>cb(data));”您介意解释一下这部分吗?所以在publish函数中,我们只需要获取map中的所有元素并找到我们需要的元素?是这样吗?[…map]
或多或少地将一个map“转换”为一个iterable,这样您就可以使用forEach:pAnother问题了,为什么我们需要将cb放入数组[cb]?我试过如果我删除“[]”它会给我错误提示:“cb不是一个函数”,但我仍然不理解根本原因。console.log([…map])
在publsh函数中查看为什么,我看到了原因。看起来我们可以用Set来代替Map,对吗?因为您使用一个对象来喜欢{event:Map},但是我们从未触及Map的值,所以我们只使用键。我说得对吗?
const channel = new EventManager;
const cb1 = data => console.log('Cb 1:', data);
const cb2 = data => console.log('Cb 2:', data);
const cb3 = data => console.log('Cb 3:', data);
channel.push('ERROR', cb1);
channel.push('ERROR', cb2);
channel.push('SUCCESS', cb3);
channel.print('ERROR', { foo: 'bar' });
channel.print('SUCCESS', { food: 'apple' });
// Cb 1: { foo: 'bar' }
// Cb 2: { foo: 'bar' }
// Cb 3: { food: 'apple' }
channel.remove('ERROR', cb1);
channel.print('ERROR', { bat: 'batt' });
// Cb 2: { bat: 'batt' }
var list = [];
var map = {}
function push(type, func) {
list.add(func);
map.set(type, list);
}
function remove(type, func) {
list.remove(func);
map.set(type, list);
}