JS异步那些事 一 (基础知识)
JS异步那些事 二 (分布式事件)
JS异步那些事 三 (Promise)
JS异步那些事 四(HTML 5 Web Workers)
JS异步那些事 五 (异步脚本加载)javascript
从原生的js角度,咱们要监听某事件的方法就是利用addEventListener方法,可是当咱们的页面趋于复杂,好比要向某个元素添加多个处理事件,那么就要用一个封装函数聚集多个处理函数java
link.onclick = function() { clickHandler1.apply(this, arguments); clickHandler2.apply(this, arguments); };
在jquery中,jquery.on()方法使用的比较多,在新版的jquery中,也舍弃了bind()方法,统一使用on,jQuery 将link 元素的事件发布给了任何想订阅此事件的人。
Node.js中的EventEmitter 对象jquery
要想给EventEmitter 对象添加一个事件处理器,只要以事件类型和事件处理器为参数调用on 方法便可。segmentfault
emitter.on('evacuate', function(message) { console.log(message); });
emit(意为“触发”)方法负责调用给定事件类型的全部处理器。举个例子,下面这行代码:app
emitter.emit('evacuate');
将调用evacuate 事件的全部处理器。异步
请注意,这里的术语事件跟事件队列没有任何关系。分布式
使用emit 方法触发事件时,能够添加任意多的附加参数。全部参数均传递至全部处理器。函数
emitter.emit('evacuate', 'Woman and children first!');
事件名称不存在任何限制,然而Node 相关文档仍是规定了一条有用的约定。ui
一个PubSub模型主要方法有3个,订阅,退订,发布this
<script type="text/javascript"> var PubSub = {}; // 用于储存事件队列 var queue = {}; // 订阅接口 PubSub.on = function(event, cb) { if (!queue[event]) { queue[event] = []; } queue[event].push(cb); }; // 退订接口 PubSub.off = function(event, cb) { var currentEvent = queue[event]; var len = 0; if (currentEvent) { len = currentEvent.length; for (var i = len - 1; i >= 0; i--) { if (currentEvent[i] === cb) { currentEvent.splice(i, 1); } } } }; // 发布接口 PubSub.emit = function(event) { var currentEvent = queue[event]; if (currentEvent) { for (var i = 0; i < currentEvent.length; i++) { currentEvent[i](); } } }; </script> ####使用 <script type="text/javascript"> // 订阅 var callbackA = function () { console.log('event a happened') }; PubSub.on('a', callbackA); PubSub.on('b', function() { console.log('event b happened') }); // 退订 , 第二个参赛传入回调函数的引用 PubSub.off('a', callbackA); // 发布 PubSub.emit('a'); PubSub.emit('b'); </script>
挖个坑 ,找一下jquery.on()的源码,看一下它自定义事件的实现
PubSub模式不适用在一次性的事件中,,若是是用Promise的话就比较适合一次性的事件。
关于分布式事件,也能够参考一下angular.js的双向数据绑定的实现,
angular.js的双向数据绑定