欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js 发布订阅模式的实例讲解

程序员文章站 2022-09-08 10:58:17
废话不多说,直接上代码 //发布订阅模式 class eventemiter{ constructor(){ //维护一个对象 thi...

废话不多说,直接上代码

//发布订阅模式
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('失恋');
//绑定一次,触发多次,也只执行一次。触发后一次将数组中的哪一项删除掉下次触发就不会执行

以上这篇js 发布订阅模式的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。