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


Posted in Javascript onSeptember 10, 2017

废话不多说,直接上代码

//发布订阅模式
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 发布订阅模式的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript转换字符串为dom对象(字符串动态创建dom)
May 10 Javascript
js中的屏蔽的使用示例
Jul 30 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
Jan 02 Javascript
详解javascript new的运行机制
Jan 26 Javascript
jQuery 限制输入字符串长度
Jun 20 Javascript
基于JavaScript实现的快速排序算法分析
Apr 14 Javascript
H5上传本地图片并预览功能
May 08 Javascript
node内置调试方法总结
Feb 22 Javascript
javascript与PHP动态往类中添加方法对比
Mar 21 Javascript
javascript动态创建对象的属性详解
Nov 07 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
Oct 31 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
Apr 27 Javascript
node.js 发布订阅模式的实例
Sep 10 #Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
Sep 10 #Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
Sep 10 #Javascript
基于AngularJS的简单使用详解
Sep 10 #Javascript
JS获取字符对应的ASCII码实例
Sep 10 #Javascript
Angular4学习笔记之根模块与Ng模块
Sep 09 #Javascript
关于vue-router的beforeEach无限循环的问题解决
Sep 09 #Javascript
You might like
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
php对象和数组相互转换的方法
2015/05/12 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
javascript下function声明一些小结
2007/12/28 Javascript
JavaScript 格式字符串的应用
2010/03/29 Javascript
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
UserData用法总结 lanyu出品
2010/07/01 Javascript
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
js图片轮播效果实现代码
2020/04/18 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
Python3基础之输入和输出实例分析
2014/08/18 Python
理解Python垃圾回收机制
2016/02/12 Python
Python中property属性实例解析
2018/02/10 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
python3中确保枚举值代码分析
2020/12/02 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
车间班组长的职责
2013/12/13 职场文书
大学生职业规划前言模板
2013/12/27 职场文书
暑期实践思想汇报
2014/01/06 职场文书
初级会计求职信范文
2014/02/15 职场文书
大学生应聘求职信
2014/05/26 职场文书
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers