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中使用构造器创建对象无需new的情况说明
Mar 01 Javascript
详解AngularJS中自定义指令的使用
Jun 17 Javascript
jQuery实现的网格线绘制方法
Jun 20 Javascript
Bootstrap和Java分页实例第一篇
Dec 23 Javascript
angular select 默认值设置方法
Jun 23 Javascript
浅谈Angular路由守卫
Aug 26 Javascript
浅谈webpack-dev-server的配置和使用
May 17 Javascript
基于vue实现可搜索下拉框定制组件
Mar 26 Javascript
Vue中fragment.js使用方法小结
Feb 17 Javascript
JQuery表单元素取值赋值方法总结
May 12 jQuery
解决vue单页面应用进入页面加载所有 js 的问题
Aug 12 Javascript
解决vue scoped html样式无效的问题
Oct 24 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中文本操作的类
2007/03/17 PHP
php类中private属性继承问题分析
2012/11/01 PHP
如何用PHP实现插入排序?
2013/04/10 PHP
php常用字符串比较函数实例汇总
2014/11/24 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
Laravel如何友好的修改.env配置文件详解
2017/06/07 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
actionscript与javascript的区别
2011/05/25 Javascript
javascript数组的使用
2013/03/28 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
node.js中的emitter.on方法使用说明
2014/12/10 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
JS使用正则实现去掉字符串左右空格的方法
2016/12/27 Javascript
a标签置灰不可点击的实现方法
2017/02/06 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
Python for i in range ()用法详解
2020/09/18 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
2012/11/25 面试题
就业自荐信
2013/12/04 职场文书
优秀高中生事迹材料
2014/02/11 职场文书
建材投资建议书
2014/05/16 职场文书
2015年小学校长工作总结
2015/05/19 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
《烈火英雄》观后感:致敬和平时代的英雄
2019/11/11 职场文书
springboot读取resources下文件的方式详解
2022/06/21 Java/Android