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----文件操作
Jan 18 Javascript
javascript getElementsByTagName
Jan 31 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
Jan 03 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
Sep 24 Javascript
javascript搜索框点击文字消失失焦时文本出现
Sep 18 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
Mar 30 Javascript
js轮播图代码分享
Jul 14 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
Jul 22 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
Dec 19 Javascript
vue服务端渲染添加缓存的方法
Sep 18 Javascript
Vue项目接入Paypal实现示例详解
Jun 04 Javascript
基于ant design日期控件使用_仅月份的操作
Oct 27 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
新浪新闻小偷
2006/10/09 PHP
PHP4与PHP5的时间格式问题
2008/02/17 PHP
php pack与unpack 摸板字符字符含义
2009/10/29 PHP
PHP中ob_start函数的使用说明
2013/11/11 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
javascript new fun的执行过程
2010/08/05 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
BootStrap glyphicons 字体图标实现方法
2016/05/01 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
Vue实现手机计算器
2020/08/17 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
使用requests库制作Python爬虫
2018/03/25 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
新加坡交友网站:be2新加坡
2019/04/10 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
医院实习接收函
2014/01/12 职场文书
热爱祖国演讲稿
2014/05/04 职场文书
意外伤害赔偿协议书
2014/09/16 职场文书
2014年终个人工作总结
2014/11/07 职场文书
搞笑婚前保证书
2015/02/28 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书
HTML基础详解(上)
2021/10/16 HTML / CSS