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 相关文章推荐
jquery 表单取值常用代码
Dec 22 Javascript
jQuery获取地址栏参数插件(模仿C#)
Oct 26 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
Oct 23 Javascript
html文件中jquery与velocity变量中的$冲突的解决方法
Nov 01 Javascript
动态标签 悬停效果 延迟加载示例代码
Nov 21 Javascript
判断客户浏览器是否支持cookie的示例代码
Dec 23 Javascript
jquery delay()介绍及使用指南
Sep 02 Javascript
详解微信小程序开发之城市选择器 城市切换
Jan 17 Javascript
简单的vue-resourse获取json并应用到模板示例
Feb 10 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
Apr 13 Javascript
js实现滑动滑块验证登录
Jul 24 Javascript
微信小程序入门之指南针
Oct 22 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面向对象 字段的声明与使用
2012/06/14 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
基于jquery库的tab新形式使用
2012/11/16 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
python实现随机密码字典生成器示例
2014/04/09 Python
python使用百度翻译进行中翻英示例
2014/04/14 Python
python操作xml文件详细介绍
2014/06/09 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
Django自定义认证方式用法示例
2017/06/23 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
如何清空Session
2015/02/23 面试题
大专生自荐信
2013/10/04 职场文书
大学生最新职业生涯规划书范文
2014/01/12 职场文书
化学教学随笔感言
2014/02/19 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS
Mysql开启外网访问
2022/05/15 MySQL