JavaScript事件发布/订阅模式原理与用法分析


Posted in Javascript onAugust 21, 2018

本文实例讲述了JavaScript事件发布/订阅模式原理与用法。分享给大家供大家参考,具体如下:

1、发布/订阅模式也是诸多设计模式当中的一种;

2、这种方式可以在es5下相当优雅地处理异步操作;

3、什么是发布/订阅呢?我们举个栗子:

假设fn1,fn2,fn3都可以视作一个事件的发布者,执行它,就会发布一个事件。这个时候,我们可以通过一个事件的订阅者去批量订阅并处理这些事件,包括它们的先后顺序。增加一个消息订阅者的方法:

class AsyncFunArr {
 constructor (...arr) {
  this.funcArr = [...arr]
 }
 next () {
  const fn = this.funcArr.shift()
  if (typeof fn === 'function') fn()
 }
 run () {
  this.next()
 }
}

4、调用

//首先将fn1,fn2,fn3订阅
const asyncFunArr = new AsyncFunArr(fn1, fn2, fn3)
//fn1,fn2,fn3作为分布者分别调用其next()方法:
function fn1 () {
 console.log('Function 1')
 asyncFunArr.next()
}
function fn2 () {
 setTimeout(() => {
  console.log('Function 2')
  asyncFunArr.next()
 }, 500)
}
function fn3 () {
 console.log('Function 3')
 asyncFunArr.next()
}

5、输出:

// Function 1
// Function 2
// Function 3

6、总结:

通过上述方法,可以实现很多,如异步请求数据等。

7、参考资料:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/constructor

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
在jQuery ajax中按钮button和submit的区别分析
Oct 07 Javascript
重写javascript中window.confirm的行为
Oct 21 Javascript
原生Js实现简易烟花爆炸效果的方法
Mar 20 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
Mar 28 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
Sep 23 Javascript
Javascript+CSS3实现进度条效果
Oct 28 Javascript
微信小程序 MD5加密登录密码详解及实例代码
Jan 12 Javascript
jquery操作ul的一些操作笔记整理(干货)
Aug 31 jQuery
原生js实现仿window10系统日历效果的实例
Oct 31 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
Jul 21 Javascript
Vue父子组件双向绑定传值的实现方法
Jul 31 Javascript
详解vue使用插槽分发内容slot的用法
Mar 28 Javascript
javascript和php使用ajax通信传递JSON的实例
Aug 21 #Javascript
小程序开发基础之view视图容器
Aug 21 #Javascript
详解微信小程序的 request 封装示例
Aug 21 #Javascript
Mint-UI时间组件起始时间问题及时间插件使用
Aug 20 #Javascript
vue监听对象及对象属性问题
Aug 20 #Javascript
微信小程序中使用自定义图标(阿里icon)的方法
Aug 20 #Javascript
Vue插件打包与发布的方法示例
Aug 20 #Javascript
You might like
php中全局变量global的使用演示代码
2011/05/18 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
php7新特性的理解和比较总结
2019/04/14 PHP
List Installed Software Features
2007/06/11 Javascript
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
javascript中的void运算符语法及使用介绍
2013/03/10 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
vue-cli配置全局sass、less变量的方法
2019/06/06 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
vue实现选中效果
2020/10/07 Javascript
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
Python中logging实例讲解
2019/01/17 Python
python如何实现复制目录到指定目录
2020/02/13 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
2020/07/07 Python
python定时截屏实现
2020/11/02 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
Python爬虫开发与项目实战
2020/12/16 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
10个顶级Python实用库推荐
2021/03/04 Python
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
七年级生物教学反思
2014/01/30 职场文书
怎样写好自我评价呢?
2014/02/16 职场文书
幼儿园儿童节主持词
2014/03/21 职场文书
介绍信范文大全
2015/05/07 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript