要被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??
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
jQuery的自定义事件也是发布订阅模式,类比一下:
其中
on
相当于订阅,trigger
相当于发布。 想一下事件的绑定和事件的触发,其实发布订阅也是跟这个一致的,因此应该在同一个元素上。再回到你的第一个问题,
pubsubz
的代码相当于一个简单的实现发布订阅模式的JavaScript库(类似的还有AmplifyJS)。毕竟,发布订阅模式是需要用代码自行实现的。pubsubz
为你提供发布订阅功能,你在任何需要发布订阅功能的时候,调用它提供的publish
和subscribe
方法就可以了。因为
pubsubz
只是一个很简单的发布订阅模式的实现,它相当于要求你所有的订阅(理解为绑定自定义事件)、发布(理解为触发自定义事件)都在它这个元素上。觉得少了个参与者。
通常应该是:
x1.subscribe(x2, 'xxx', somehandle);
然后是:
x2.publish('xxx', message);
其中x1是订阅者,x2是发布者。
不用认为它都是对的,斟酌着看
pubsuz可以看作代理
回调函数可以看作订阅者,因为最后消息还是被发送给了回调函数
如果用原型链写
x1.__proto__.publish = pubsub.publish
,那么调用x1.publish()
的话发布者就是X1咯?个人感觉订阅发布模式的核心就是回调……