pubsub.js简介,一个利用JavaScript进行发布/订阅的库
很长一段时间里,我一直在致力于为某客户开发大型Web应用程序。为web前端实现发布/订阅式通信,我们使用在body元素上被触发的jQuery自定义事件。这是一个相当巧妙的方法,以确保模块松耦合,因为你事实上只是跟踪用户做什么,而不是哪个模块生成的消息。
这种方法已经被我介绍给我的团队,而且我一直很热心地帮助我的队友知道如何使用它。
我对这个方法一直很满意,我已经在BerlinJS讨论组中发起了一个讨论。其他一些人也已采取这种方法,有些已在脚注中列出。
最近,我对这种方法越来越不满意了。
在使用jQuery自定义事件进行发布/订阅时你最终会遇到其中一个问题,就是它们是同步的,所以你最终会在你对当前事件结束操作之前触发新的事件。
它会变得很乱,相信我。那么,为什么需要一个新库?
嗯,其实有很多原因,最终使我在用JavaScript做发布/订阅中消息时寻找更好的方法。
我想要的东西将满足下列大部分的要求:• 有合理软件许可的出版商(CC,MIT,BSD,Apache,WTFPL等)
• 所有消息默认通过异步发送,别的只会令人困扰
• 不使用DOM(它太慢,并很愚蠢的存储一些你无法控制的状态)
• 纯JavaScript的,没有对其它库的依赖
• 没有副作用,用jQuery修改订阅(给函数增加一个“ID”属性)
• 应当能运行于浏览器外
• 应当有最新的文档(或至少与基本代码一致)
• 测试是重要的好吗?
• 短小精悍
那么,事实证明,我在互联网上搜索空手而归(我的Google-fu应该更好),所以我决定亲自写一个实现。我把它叫做PubSubJS。
我已经把它发布在http://github.com/mroderick/PubSubJS,你可以轻松得到它,如果你喜欢就运行测试,甚至通过扩展而为它做出贡献。
那么,这个PubSubJS可以做什么呢?
不是很多。
基本上,你可以订阅的息,发布消息(通过一个绑定项)和消息退订。如果你喜欢冒险的感觉(或你真的相信已经100%的理解库的前因后果),你也可以用同步方式强制发布消息。
让我们来看看一些写好的代码!
所以,就像你可以看到,它用起来十分简单。
为了说明利用JavaScript和JavaScript + DOM在执行速度方面的不同,我创建了一个JSPerf.com 测试页面,就是compares PubSubJS performance to jQuery custom events。你可以去试一下。
那么,我是不是该使用它?
不!… 当然,也许 …
如果你正在构建较大的web应用程序,而且需要在模块/组件/构件等之间具有松耦合,那么发布/订阅可能是你要寻找的答案。如果在你构建较大的web应用程序时碰巧使用Dojo并需要发布/订阅,那么我建议你看一下早在Dojo的实施方案,或联系Rebecca Murphey ;-)
想想看:发布/订阅有点像炸药。在考虑周全的专家之手,你可以期望在合理的时间内有安全地拆除一幢摩天大楼。在业余爱好者手中,使用炸药,你最终会看到最不想看到的,在一片非常嘈杂而凌乱的情况下告终。而且可以肯定,每过一段时间,就算是专家也会犯错误。
“那么为什么还要写一个发布/订阅库?”你可能会问,而得到的答案很简单:我需要它,就像爆破专家需要获得高效、稳定和可预测的炸药。不要说我没提醒过你。
• Sammy.js还使用jQuery自定义事件。然而,我还是试图说服Aaron使用纯JavaScript发布/订阅消息来代替。
• 处理错误和用发布订阅加载通知
写PubSubJS后,我发现Peter Higgins已经为jQuery实现了发布/订阅。
/*-----------------------------------------------------分割线------------------------------------------------------------*/
首次翻译,借助Google翻译进行辅助,比较拙略,难免有不尽人意的地方,还请大家多多包涵!O(∩_∩)O~
原文地址:roderick.dk/2010/10/12/introducing-pubsubjs-a-library-for-doing-publish-subscribe-in-javascript/
相关文章
- JavaScript_DOM
- 教程 | face-api.js:在浏览器中进行人脸识别的JavaScript接口
- jQuery 追加元素、拼接元素的方法总结(append、html、insertBefore、before等) 初识document.onkeydown及其兼容性问题 js学习笔记27----键盘事件 JavaScript onkeydown事件入门实例(键盘某个按键被按下)
- JavaScript的数学计算库:decimal.js
- JavaScript - 实现向 formData 对象中追加数组或对象,使用 append() 插入数组、对象等复杂数据类型(vue / uniapp / react 项目通用解决方案)
- JavaScript - H5 网页拨打电话功能、发送短信、发送邮件(支持 HTML 与 JS 形式)点击自动调起手机拨打并填充手机号
- ECMAScript、JavaScript、Node.js的区别与联系
- 【JavaScript】关于JS中的constructor与prototype
- JavaScript里的回调函数属于闭包吗?
- javascript子窗口父窗口相互操作 取值赋值的问题
- javascript 闭包
- JavaScript 稀奇的js语法
- 《HTML、CSS、JavaScript 网页制作从入门到精通》——导读
- 《JavaScript设计与开发新思维》——第2章JavaScript 2.1 选择DOCTYPE
- 《JavaScript机器人编程指南》——第1章 开始学习JS机器人技术
- 使用 JavaScript 在浏览器中构建机器学习模型,学习使用 TensorFlow.js 和 JavaScript 在浏览器中构建机器学习模型
- JS教程之 JavaScript 框架之战已经结束,而且只有一个赢家
- 前端模板引擎artTemplate---高性能JavaScript模板引擎
- 【零基础学JS -7】Javascript中的数字
- [js高手之路]一步步图解javascript的原型(prototype)对象,原型链
- JavaScript_JS判断客户端是否是iOS或者Android
- JavaScript事件小结
- JavaScript之面向对象学习五(JS原生引用类型Array、Object、String等等)的原型对象介绍
- JavaScript之JS实现动画效果
- 比较有意思的原生态js拖拽写法----摘自javascript高级程序设计3