要被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??

设计模式 JavaScript

kkkkkkk 9 years, 10 months ago

pubsuz可以看作代理

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

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

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

圆脸D鬼神 answered 9 years, 10 months ago

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

依尔sama answered 9 years, 10 months ago

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


 var elem = $("#example");

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

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

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

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

df600a answered 9 years, 10 months ago

Your Answer