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中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
Aug 12 Javascript
node.js中的emitter.on方法使用说明
Dec 10 Javascript
js实现汉字排序的方法
Jul 23 Javascript
jQuery+HTML5美女瀑布流布局实现方法
Sep 21 Javascript
跟我学习javascript的函数和函数表达式
Nov 16 Javascript
javascript实现添加附件功能的方法
Nov 18 Javascript
几行js代码实现自适应
Feb 24 Javascript
JavaScript注册时密码强度校验代码
Jun 30 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
Oct 14 jQuery
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
vue-resource请求实现http登录拦截或者路由拦截的方法
Jul 11 Javascript
Vue数字输入框组件使用方法详解
Feb 10 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
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
javascript中的作用域scope介绍
2010/12/28 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
javascript DOM的详解及实例代码
2017/03/06 Javascript
微信小程序 页面跳转传值实现代码
2017/07/27 Javascript
深入理解Vue 单向数据流的原理
2017/11/09 Javascript
layui 给数据表格加序号的方法
2018/08/20 Javascript
Vue 幸运大转盘实现思路详解
2019/05/06 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
python使用7z解压软件备份文件脚本分享
2014/02/21 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
python爬虫中get和post方法介绍以及cookie作用
2018/02/08 Python
Python实现全排列的打印
2018/08/18 Python
python3.7 的新特性详解
2019/07/25 Python
python调用摄像头的示例代码
2020/09/28 Python
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
亲戚结婚的请假条
2014/02/11 职场文书
文体活动实施方案
2014/03/27 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
入股协议书范本
2014/04/14 职场文书
食品工程专业求职信
2014/06/15 职场文书
个人查摆问题及整改措施
2014/10/16 职场文书
护理工作个人总结
2015/03/03 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers
vue使用element-ui按需引入
2022/05/20 Vue.js