Instantly share code, notes, and snippets.

Embed
What would you like to do?
Design Patterns : Publish / Subscribe Pattern
/**
* @fileoverview The sample js file that are thought that publishes the coming data from an API endpoint
* @author hwclass
*/
/**
* ajax.js
* This file contains a publish command for productsFetchedEvent
*/
'use strict';
//-----------------------------------------------------------
// Public
//-----------------------------------------------------------
publish('productsFetchedEvent', {desc : 'This is the test data for products!'});
/**
* @fileoverview The main methods are contained here to broadcast and catch event mechanism
* @author hwclass
*/
/**
* app.js
* This file contains subscription and publish methods to setup an event stream
*/
'use strict';
//-----------------------------------------------------------
// Public
//-----------------------------------------------------------
var TOPICS = TOPICS || {};
/**
* subscribe method
* @param {String} topic
* @param {Function} listener
*/
var subscribe = function (topic, listener) {
if(!TOPICS[topic]) TOPICS[topic] = { queue: [] };
var index = TOPICS[topic].queue.push(listener);
return (function(index) {
return {
remove: function() {
delete TOPICS[index];
}
}
})(index);
}
/**
* publish method
* @param {String} topic
* @param {Object} info
*/
var publish = function (topic, info) {
if(!TOPICS[topic] || !TOPICS[topic].queue.length) return;
var items = TOPICS[topic].queue;
for(var x = 0; x < items.length; x++) {
items[x](info || {});
}
}
/**
* @fileoverview A principle file that is used to make some functional things over a list view
* @author hwclass
*/
/**
* productList.js
* This is an only a sample file to be initialized in a view that lists products
*/
'use strict';
//-----------------------------------------------------------
// Public
//-----------------------------------------------------------
subscribe('productsFetchedEvent', function (data) {
console.log('Published data : ' + data.desc);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment