Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用多种方法实现事件管理器_Javascript_Node.js - Fatal编程技术网

Javascript 使用多种方法实现事件管理器

Javascript 使用多种方法实现事件管理器,javascript,node.js,Javascript,Node.js,实现EventManager类 推送(事件:字符串,方法:函数) 删除(事件:字符串,方法:函数) 打印(事件:字符串,数据:somedata) 我的想法是使用new Map()来解决死胡同循环问题,Map的 键为事件类型,值为函数列表 按-将函数添加到列表中 移除-从列表中移除该函数 打印-使用事件类型从映射中获取列表,数据调用函数 我不知道如何实现“print”方法,我也不确定是否需要使用回调函数来解决这个问题? 也不确定我的“推”和“删除”是否在正确的轨道上你很接近了(不是真的) 类事件

实现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);
    }