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 相关文章推荐
javascript addBookmark 加入收藏 多浏览器兼容
Aug 15 Javascript
JavaScript 三种创建对象的方法
Oct 16 Javascript
可以将word转成html的js代码
Apr 11 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
Aug 24 Javascript
js导入导出excel(实例代码)
Nov 25 Javascript
js取得html iframe中的元素和变量值
Jun 30 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
Feb 08 Javascript
React Native使用fetch实现图片上传的示例代码
Mar 07 Javascript
puppeteer实现html截图的示例代码
Jan 10 Javascript
JS实现判断有效的数独算法示例
Feb 25 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
Mar 16 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
Nov 12 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
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
php对gzip文件或者字符串解压实例参考
2008/07/25 PHP
隐性调用php程序的方法
2009/03/09 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
JavaScript中的数学运算介绍
2014/12/29 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
[01:22:10]Ti4 循环赛第二日 DK vs Empire
2014/07/11 DOTA
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
python查找第k小元素代码分享
2013/12/18 Python
用Python从零实现贝叶斯分类器的机器学习的教程
2015/03/31 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
10款最好的Python开发编辑器
2019/07/03 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
Python如何输出百分比
2020/07/31 Python
超级实用的8个Python列表技巧
2020/08/24 Python
python3判断IP地址的方法
2021/03/04 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
暑假家长评语大全
2014/04/17 职场文书
质量负责人任命书
2014/06/06 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
葬礼主持词
2015/07/02 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
PHP实现创建以太坊钱包转账等功能
2021/04/21 PHP
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏