简易版事件总线 EventBus

55 阅读1分钟
    constructor(){
        this.list={}
    }
    on(name,fn){
        if(this.list[name]){
            this.list[name].push({fn:fn,once:false})
        }else{
            this.list[name] = [{fn:fn,once:false}]
        }
    }
    emit(name,...data){
        if(this.list[name]){
            let arr = this.list[name]
            if(arr.length>0){
                arr.forEach((item,index) => {
                   item.fn(...data)
                   if(item.once){
                        delete this.list[name][index]
                   } 
                });
            }
        }
    }
    off(name,fn){
        if(this.list[name]){
            if(fn){
                while(this.list[name].findIndex(item=>item.fn==fn)!=-1){
                    this.list[name].splice(this.list[name].findIndex(item=>item.fn==fn),1)
                }
            }else{
                this.list[name]=[]
            }
            
        }
    }
    once(name,fn){
        if(this.list[name]){
            if(!fn){
                this.list[name]=null
            }else{
                let index = this.list[name].findIndex(item=>item.fn==fn)
                 if(index!=-1){
                     console.log(this.list[name],index)
                     this.list[name][index].once = true
                 }else{
                     this.list[name].push({fn:fn,once:true})
                 }
            }
            
        }
    }
}
let a=(res)=>{
    console.log('this.is.on1')
}
let bus = new eventBus()
bus.on('key',a)
bus.once('key',res=>{
    console.log('this is once')
})
bus.on('key',(res)=>{
    console.log('this.is.on2')
})
bus.off('key',a)
bus.emit('key','123')
bus.emit('key',456)
```class eventBus{
    constructor(){
        this.list={}
    }
    on(name,fn){
        if(this.list[name]){
            this.list[name].push({fn:fn,once:false})
        }else{
            this.list[name] = [{fn:fn,once:false}]
        }
    }
    emit(name,...data){
        if(this.list[name]){
            let arr = this.list[name]
            if(arr.length>0){
                arr.forEach((item,index) => {
                   item.fn(...data)
                   if(item.once){
                        delete this.list[name][index]
                   } 
                });
            }
        }
    }
    off(name,fn){
        if(this.list[name]){
            if(fn){
                while(this.list[name].findIndex(item=>item.fn==fn)!=-1){
                    this.list[name].splice(this.list[name].findIndex(item=>item.fn==fn),1)
                }
            }else{
                this.list[name]=[]
            }
            
        }
    }
    once(name,fn){
        if(this.list[name]){
            if(!fn){
                this.list[name]=null
            }else{
                let index = this.list[name].findIndex(item=>item.fn==fn)
                 if(index!=-1){
                     console.log(this.list[name],index)
                     this.list[name][index].once = true
                 }else{
                     this.list[name].push({fn:fn,once:true})
                 }
            }
            
        }
    }
}
let a=(res)=>{
    console.log('this.is.on1')
}
let bus = new eventBus()
bus.on('key',a)
bus.once('key',res=>{
    console.log('this is once')
})
bus.on('key',(res)=>{
    console.log('this.is.on2')
})
bus.off('key',a)
bus.emit('key','123')
bus.emit('key',456)