js 发布订阅模式

2018-06-24 00:10:16来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

//发布订阅模式
class EventEmiter{
    constructor(){
        //维护一个对象
        this._events={

        }
    }
    on(eventName,callback){
        if( this._events[eventName]){
            //如果有就放一个新的
            this._events[eventName].push(callback);
        }else{
            //如果没有就创建一个数组
            this._events[eventName]=[callback]
        }
    }
    emit(eventName,...rest){
        if(this._events[eventName]){ //循环一次执行
            this._events[eventName].forEach((item)=>{
                item.apply(this,rest)
            });
        }
    }
    removeListener(eventName,callback){
        if(this._events[eventName]){
            //当前数组和传递过来的callback相等则移除掉
            this._events[eventName]=
                this._events[eventName].filter(item=>item!==callback);
        }
    }
    once(eventName,callback){
        function one(){
            //在one函数运行原来的函数,只有将one清空
            callback.apply(this,arguments);
            //先绑定 执行后再删除
            this.removeListener(eventName,one);
        }
        this.on(eventName,one);
            //此时emit触发会执行此函数,会给这个函数传递rest参数
    }
}
class Man extends EventEmiter{}
let man=new Man()
function findGirl() {
    console.log('找新的女朋友')
}
function saveMoney() {
    console.log('省钱')
}
man.once('失恋',findGirl);
//man.on('失恋',findGirl) //失恋 ,绑定一个函数方法
man.on('失恋',saveMoney)//失恋 ,绑定一个函数方法
man.removeListener('失恋',saveMoney); //移除一个函数方法
man.emit('失恋');
//绑定一次,触发多次,也只执行一次。触发后一次将数组中的哪一项删除掉下次触发就不会执行

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:SVG渐变

下一篇:正则表达式语法