2012-03-25 2 views
0

Это паб суб библиотека Питера Хиггинса: 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

В этом контексте && используется как сокращение для:

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 
0

В принципе, вы называете каждый тему обратного вызова (если таковые имеются) с аргументами (если передаются какие-либо аргументы). Таким образом, вы можете:

$.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 
0
cache[topic] && d.each(cache[topic], function() { 
    this.apply(d, args || []); 
}); 

Применение для каждого элемента д, если кэш [тема] определена, функция, который вызывает применять метод его с d аргумента, и args, или пустой массив, если args не определен.