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 判断代码全收集
Apr 28 Javascript
jQueryUI如何自定义组件实现代码
Nov 14 Javascript
juqery 学习之三 选择器 子元素与表单
Nov 25 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
Sep 03 Javascript
js中的json对象详细介绍
Oct 29 Javascript
谈一谈js中的执行环境及作用域
Mar 30 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
Jun 14 Javascript
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
Jun 18 Javascript
js倒计时简单实现代码
Aug 11 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
Jul 06 Javascript
vant中的toast层级改变操作
Nov 04 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通过递归方式复制目录和子目录的方法
2015/03/13 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
PHP 5.6.11中CURL模块问题的解决方法
2016/08/08 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
使用js判断控件是否获得焦点
2014/01/03 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
使用python接入微信聊天机器人
2020/03/31 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
Html5无刷新修改browser Url的方法
2014/01/15 HTML / CSS
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
护士演讲稿优秀范文
2014/04/30 职场文书
我与祖国共奋进演讲稿
2014/09/13 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
法律服务所工作总结
2015/08/10 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
《落花生》教学反思
2016/02/16 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android