要被JavaScript的订阅发布模式玩坏了

Karon_
  • 1.1k

上代码:

;(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??

回复
阅读 3.3k
3 个回答
✓ 已被采纳

jQuery的自定义事件也是发布订阅模式,类比一下:

var elem = $("#example");

elem.on("hello", function(){});
elem.trigger("hello");

其中on相当于订阅,trigger相当于发布。 想一下事件的绑定和事件的触发,其实发布订阅也是跟这个一致的,因此应该在同一个元素上。

再回到你的第一个问题,pubsubz的代码相当于一个简单的实现发布订阅模式的JavaScript库(类似的还有AmplifyJS)。毕竟,发布订阅模式是需要用代码自行实现的。pubsubz为你提供发布订阅功能,你在任何需要发布订阅功能的时候,调用它提供的publishsubscribe方法就可以了。

因为pubsubz只是一个很简单的发布订阅模式的实现,它相当于要求你所有的订阅(理解为绑定自定义事件)、发布(理解为触发自定义事件)都在它这个元素上。

觉得少了个参与者。
通常应该是: x1.subscribe(x2, 'xxx', somehandle);
然后是:x2.publish('xxx', message);
其中x1是订阅者,x2是发布者。
不用认为它都是对的,斟酌着看

pubsuz可以看作代理

回调函数可以看作订阅者,因为最后消息还是被发送给了回调函数

如果用原型链写
x1.__proto__.publish = pubsub.publish,那么调用x1.publish()的话发布者就是X1咯?

个人感觉订阅发布模式的核心就是回调……

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏