Pull to refresh

Pub/Sub JavaScript объект

Reading time2 min
Views18K
Original author: David Walsh
Перевод статьи «Pub/Sub JavaScript Object», David Walsh

Есть три техники написания AJAX веб-сайтов: делегация событий, управление историей и коммуникация pub/sub на уровне приложения. Я использую все три техники и я хотел бы поделиться с вами самой простой из них: крошечным pub/sub модулем, который я использую на своем веб-сайте.

Если вы не знаете, что такое pub/sub, то суть в том, что вы публикуете в некую тему(topic), и кто угодно может на нее подписываться. Это похоже на то, как работает радио: радиостанция вещает (публикует) и каждый может слушать (подписываться). Это превосходный подход для модульных веб-приложений; это способ глобальной коммуникации без привязки к какому-то конкретному объекту.

JavaScript


Сам по себе модуль очень миниатюрный, но очень полезный:
var events = (function(){
  var topics = {};

  return {
    subscribe: function(topic, listener) {
      // создаем объект topic, если еще не создан
      if(!topics[topic]) topics[topic] = { queue: [] };

      // добавляем listener в очередь
      var index = topics[topic].queue.push(listener) -1;

	// предоставляем возможность удаления темы
	return {
		remove: function() {
			delete topics[topic].queue[index];
		}
	};
    },
    publish: function(topic, info) {
      // если темы не существует или нет подписчиков, не делаем ничего
      if(!topics[topic] || !topics[topic].queue.length) return;

      // проходим по очереди и вызываем подписки
      var items = topics[topic].queue;
      items.forEach(function(item) {
      		item(info || {});
      });
    }
  };
})();

Публикуем в тему:
events.publish('/page/load', {
	url: '/some/url/path' // любой аргумент
});

… подписываемся на тему, чтобы получать уведомления о событиях:
var subscription = events.subscribe('/page/load', function(obj) {
	// делаем что-нибудь, когда событие происходит
});

// ...теперь мне эта подписка больше не нужна...
subscription.remove();

Я скрупулезно использую pub/sub religiously на своем веб-сайте, и этот объект сделал мне кучу добра. У меня есть тема на загрузку страницы через AJAX и несколько подписок, которые вызываются при этом событии (перерисовка рекламы, комментариев, социальных иконок и тд.). Проверьте, где в вашем приложении можно использовать pub/sub!
Tags:
Hubs:
Total votes 21: ↑8 and ↓13-5
Comments4

Articles