JavaScript异步编程(二) 分布式事件
分布式事件
发布/订阅模式分发事件
・PubSub模式
浏览器允许向DOM元素附加事件处理器;
Node的EventEmitter对象
emitter.on(‘evacuate’, function() {…});
emitter.emit(‘evacuate’);
emit意为触发,负责调用给定事件类型的所有处理器
创建自己的PubSub
PubSub.on = function(eventType, handler) {
if(!(eventType in this.handlers)) {
this.handlers[eventType] = handler;
return this;
}
};
PubSub.emit = function(eventType) {
var handlerArgs = Array.prototype.slice.call(arguments, 1);
for(var i =0; i < this.handlers[eventType].length; i++) {
this.handlers[eventType][i].apply(this, handlerArgs);
}
return this;
};
jQuery的名称空间化事件
如果同时绑定了名称为click.tbb和hover.tbb两个事件,简单地调用unbind(‘.tbb’)就可以同时解绑它们。
jQuery还支持用空格隔开多个事件来同时绑定或触发多种事件类型。
同步性
PubSub模式是一项处理异步事件的重要技术,但内在跟异步没有任何关系。
PubSub模式简化了事件的命名、分发和堆积。
・事件化模型
只要对象带有PubSub接口,就可以称之为事件化对象。
特殊情况出现在用于存储数据的对象因内容变化而发布事件是,这里用于存储数据的对象又称作模型。
老式的JavaScript依靠输入事件的处理器直接改变DOM。
新式的JavaScript先改变模型,接着由模型触发事件而导致DOM的更新。
jQuery自定义事件
在jQuery中,可以使用trigger方法基于任意DOM元素触发任何想要的事件,
冒泡技术:只要某个DOM元素触发了某个事件,其父元素就会接着触发这个事件,接着是父元素的父元素,以此类推,一直上溯到根元素。
只有在冒泡过程中调用事件的stopPropagation方法才会停止。
PubSub的缺陷在于不适用于一次性事件,一次性事件要求对异步函数执行的一次性任务的两种结果(任务成功或失败)做不同处理。例如,Ajax请求。而用于解决一次性事件问题的工具叫做Promise。