要被JavaScript的订阅发布模式玩坏了
上代码:
;(function ( window, doc, undef ) {
var topics = {},
subUid = -1,
pubsubz ={};
pubsubz.publish = function ( topic, args ) {
if (!topics[topic]) {
return false;
}
setTimeout(function () {
var subscribers = topics[topic],
len = subscribers ? subscribers.length : 0;
while (len--) {
subscribers[len].func(topic, args);
}
}, 0);
return true;
};
pubsubz.subscribe = function ( topic, func ) {
if (!topics[topic]) {
topics[topic] = [];
}
var token = (++subUid).toString();
topics[topic].push({
token: token,
func: func
});
return token;
};
pubsubz.unsubscribe = function ( token ) {
for (var m in topics) {
if (topics[m]) {
for (var i = 0, j = topics[m].length; i < j; i++) {
if (topics[m][i].token === token) {
topics[m].splice(i, 1);
return token;
}
}
}
}
return false;
};
getPubSubz = function(){
return pubsubz;
};
window.pubsubz = getPubSubz();
}( this, this.document ));
调用
var testSubscriber = function( topics , data ){
console.log( topics + ": " + data );
};
var testSubscription = pubsubz.subscribe( 'example1', testSubscriber );
pubsubz.publish( 'example1', 'hello world!' );
pubsubz.publish( 'example1', ['test','a','b','c'] );
pubsubz.publish( 'example1', [{'color':'blue'},{'text':'hello'}] );
看了一天没看懂为什么订阅和发布都是用
pubsubz
,求解:
1.到底哪个是订阅者,哪个是发布者?
2.为什么用同一个pubsubz??
kkkkkkk
9 years, 9 months ago
Answers
jQuery的自定义事件也是发布订阅模式,类比一下:
var elem = $("#example");
elem.on("hello", function(){});
elem.trigger("hello");
其中
on
相当于订阅,
trigger
相当于发布。 想一下事件的绑定和事件的触发,其实发布订阅也是跟这个一致的,因此应该在同一个元素上。
再回到你的第一个问题,
pubsubz
的代码相当于一个简单的实现发布订阅模式的JavaScript库(类似的还有
AmplifyJS
)。毕竟,发布订阅模式是需要用代码自行实现的。
pubsubz
为你提供发布订阅功能,你在任何需要发布订阅功能的时候,调用它提供的
publish
和
subscribe
方法就可以了。
因为
pubsubz
只是一个很简单的发布订阅模式的实现,它相当于要求你所有的订阅(理解为绑定自定义事件)、发布(理解为触发自定义事件)都在它这个元素上。
df600a
answered 9 years, 9 months ago