试图理解这段代码(pub / sub库)

时间:2012-03-25 06:52:22

标签: javascript jquery

这是Peter Higgins的酒吧子库:https://github.com/phiggins42/bloody-jquery-plugins/blob/master/pubsub.js

(function (d) {
    var cache = {};

    d.publish = function (topic, args) {
        cache[topic] && d.each(cache[topic], function () {
                this.apply(d, args || []);
        });
    };

    d.subscribe = function (topic, callback) {
        if (!cache[topic]) {
            cache[topic] = [];
        }
        cache[topic].push(callback);
        return [topic, callback];
    };

    d.unsubscribe = function (handle) {
        var t = handle[0];
        cache[t] && d.each(cache[t], function (idx) {
            if (this == handle[1]) {
                cache[t].splice(idx, 1);
            }
        });
    };

})(jQuery);

我不理解publish的逻辑和功能:

cache[topic] && d.each(cache[topic], function () {
    **this.apply(d, args || []);** //what is happening here?
});

这部分的目的是什么?除了它发布事件

的事实

3 个答案:

答案 0 :(得分:3)

在此上下文中,&&用作以下的简写:

if (cache[topic]) {
    d.each(cache[topic], function() { … });
}

这是因为&&(和||)是short-circuiting,所以如果左侧评估为false - ish值(或true -ish值,在||的情况下,右侧不会被评估。

例如:

> function foo(result) { console.log("foo"); return result; }
> function bar(result) { console.log("bar"); return result; }
> foo(false) && bar(true);
foo
false

答案 1 :(得分:0)

基本上,您使用args调用每个主题回调(如果有)(如果传递任何参数)。所以你可以:

$.subscribe('do_something', function(str) { alert(str + ' world!')});
$.subscribe('do_something', function(str) { console.log(str)});
$.publish('do_something', ['Hello']); // will alert Hello world! and output 'Hello' to console

答案 2 :(得分:0)

cache[topic] && d.each(cache[topic], function () {
    this.apply(d, args || []);
});

申请 d 的每个元素,如果定义了 cache [topic] ,则函数调用 apply 方法< em> d 参数, args ,如果未定义 args ,则为空数组。