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 相关文章推荐
可以支持多中格式的JS键盘
May 02 Javascript
jquery入门—选择器实现隔行变色实例代码
Jan 04 Javascript
js控制input输入字符解析
Dec 27 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
Jan 11 Javascript
js实现照片墙功能实例
Feb 05 Javascript
javascript中eval函数用法分析
Apr 25 Javascript
js模态对话框使用方法详解
Feb 16 Javascript
JS实现的base64加密解密操作示例
Apr 18 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
May 30 Javascript
vue-cli3添加模式配置多环境变量的方法
Jun 05 Javascript
Openlayers实现测量功能
Sep 25 Javascript
Nuxt的路由动画效果案例
Nov 06 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
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
vue 项目常用加载器及配置详解
2018/01/22 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
浅谈JavaScript 声明提升
2020/09/14 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
[00:57]林俊杰助阵DOTA2亚洲邀请赛
2015/01/28 DOTA
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
python模拟鼠标拖动操作的方法
2015/03/11 Python
python获取局域网占带宽最大3个ip的方法
2015/07/09 Python
Python及PyCharm下载与安装教程
2017/11/18 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
python求质数的3种方法
2018/09/28 Python
python障碍式期权定价公式
2019/07/19 Python
python 实现dict转json并保存文件
2019/12/05 Python
美国婴儿用品店:Babies”R”Us
2017/10/12 全球购物
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
函授本科自我鉴定
2013/11/03 职场文书
梅花魂教学反思
2014/04/25 职场文书
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
2014年环保局工作总结
2014/12/11 职场文书
户外活动总结
2015/02/04 职场文书