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 如何动态添加、删除class样式方法介绍
Nov 07 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
Mar 25 Javascript
关于IE中getElementsByClassName不能用的问题解决方法
Aug 26 Javascript
javascript中CheckBox全选终极方案
May 20 Javascript
JS平滑无缝滚动效果的实现代码
May 06 Javascript
基于Vue2.0的分页组件
Mar 16 Javascript
TypeScript入门-接口
Mar 30 Javascript
简单谈谈JS中的正则表达式
Sep 11 Javascript
mpvue开发音频类小程序踩坑和建议详解
Mar 12 Javascript
vue实现分页栏效果
Jun 28 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
Oct 14 Javascript
详解Vue之事件处理
Jul 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
php实现webservice实例
2014/11/06 PHP
PHP中的闭包(匿名函数)浅析
2015/02/07 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
使用javascript为网页增加夜间模式
2014/01/26 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
Python库urllib与urllib2主要区别分析
2014/07/13 Python
Python监控主机是否存活并以邮件报警
2015/09/22 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
一个基于flask的web应用诞生(1)
2017/04/11 Python
Python模块搜索路径代码详解
2018/01/29 Python
python怎么提高计算速度
2020/06/11 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
奥地利度假券的专家:we-are.travel
2019/04/10 全球购物
opencv实现图像平移效果
2021/03/24 Python
爱国演讲稿400字
2014/05/07 职场文书
环境卫生倡议书
2014/08/29 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
人民币使用说明书
2019/04/17 职场文书
如何利用python实现Simhash算法
2022/06/28 Python