Objekt JavaScript Pub/Sub

Efektivní weby založené na technologii AJAX mají tři klíče:delegování událostí, správa historie a efektivní komunikace v rámci celé aplikace s pub/sub. Tento blog využívá všechny tyto techniky a napadlo mě, že se podělím o nejjednodušší z nich: malý hospodský/podřízený modul, který používám na tomto webu.

Pokud jste dosud nepoužili pub/sub, podstatou je, že publikujete k tématu a kdokoli se může přihlásit k odběru, podobně jako funguje rádio:rozhlasová stanice vysílá (publikuje) a kdokoli může poslouchat (přihlašuje se k odběru). To je vynikající pro vysoce modulární webové aplikace; je to licence k globální komunikaci bez připojení k jakémukoli konkrétnímu objektu.

JavaScript

Samotný modul je velmi malý, ale nesmírně užitečný:

var events = (function(){
  var topics = {};
  var hOP = topics.hasOwnProperty;

  return {
    subscribe: function(topic, listener) {
      // Create the topic's object if not yet created
      if(!hOP.call(topics, topic)) topics[topic] = [];

      // Add the listener to queue
      var index = topics[topic].push(listener) -1;

      // Provide handle back for removal of topic
      return {
        remove: function() {
          delete topics[topic][index];
        }
      };
    },
    publish: function(topic, info) {
      // If the topic doesn't exist, or there's no listeners in queue, just leave
      if(!hOP.call(topics, topic)) return;

      // Cycle through topics queue, fire!
      topics[topic].forEach(function(item) {
      		item(info != undefined ? info : {});
      });
    }
  };
})();

Publikování k tématu:

events.publish('/page/load', {
	url: '/some/url/path' // any argument
});

...a přihlášení k odběru uvedeného tématu, abyste byli informováni o událostech:

var subscription = events.subscribe('/page/load', function(obj) {
	// Do something now that the event has occurred
});

// ...sometime later where I no longer want subscription...
subscription.remove();

Na této webové stránce používám nábožensky pub/sub a tento objekt mi udělal svět dobrého. Mám jedno téma, které se spouští při každém načtení stránky AJAX, a během této události se spustí několik předplatných (znovu vykreslování reklamy, opětovné vykreslení komentářů, populace sociálních tlačítek atd.). Vyhodnoťte svou aplikaci a zjistěte, kde byste mohli použít pub/sub!