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根据纬度经度查看地图处理程序
May 08 Javascript
Json和Jsonp理论实例代码详解
Nov 15 Javascript
JavaScript检测实例属性, 原型属性
Feb 04 Javascript
JavaScript实现找质数代码分享
Mar 24 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
Jun 08 Javascript
javascript兼容性(实例讲解)
Aug 15 Javascript
ES6中Array.find()和findIndex()函数的用法详解
Sep 16 Javascript
AngularJS路由删除#符号解决的办法
Sep 28 Javascript
webpack+vue中使用别名路径引用静态图片地址
Nov 20 Javascript
Vue实现用户自定义字段显示数据的方法
Aug 28 Javascript
JS实现提示框跟随鼠标移动
Aug 27 Javascript
使用Vue实现简单计算器
Feb 25 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不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
PHP删除数组中特定元素的两种方法
2013/07/02 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
解决vue-cli脚手架打包后vendor文件过大的问题
2018/09/27 Javascript
基于vue.js实现购物车
2020/01/15 Javascript
js+canvas实现转盘效果(两个版本)
2020/09/13 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
python 统计数组中元素出现次数并进行排序的实例
2018/07/02 Python
Python学习笔记之集合的概念和简单使用示例
2019/08/22 Python
pytorch::Dataloader中的迭代器和生成器应用详解
2020/01/03 Python
Python中zip函数如何使用
2020/06/04 Python
学习Python爬虫的几点建议
2020/08/05 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
2021/02/01 Python
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
信息技术教学反思
2014/02/12 职场文书
生物制药专业求职信
2014/03/11 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
归元寺导游词
2015/02/06 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
React中的Context应用场景分析
2021/06/11 Javascript
MySQL sql模式设置引起的问题
2022/05/15 MySQL
MySQL如何修改字段类型和字段长度
2022/06/10 MySQL