zoukankan      html  css  js  c++  java
  • js 发布订阅模式

    //发布订阅模式
    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('失恋');
    //绑定一次,触发多次,也只执行一次。触发后一次将数组中的哪一项删除掉下次触发就不会执行
  • 相关阅读:
    序列化二叉树
    把二叉树打印成多行
    按之字形顺序打印二叉树
    对称的二叉树
    二叉树的下一个节点
    java ee项目用gradle依赖打包
    spring cloud gateway 拦截request Body
    oauth2学习
    docker 应用
    gradle spring 配置解释
  • 原文地址:https://www.cnblogs.com/null11/p/7498820.html
Copyright © 2011-2022 走看看