pub/sub
by Artem
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 || {});
});
}
};
})();
//… подписываемся на тему, чтобы получать уведомления о событиях:
var subscription = events.subscribe('/page/load', function(obj) {
// делаем что-нибудь, когда событие происходит
console.log('something');
});
//Публикуем в тему:
events.publish('/page/load', {
url: '/some/url/path' // любой аргумент
});
// ...теперь мне эта подписка больше не нужна...
subscription.remove();