Skip to content

Instantly share code, notes, and snippets.

@hwclass
Created July 2, 2015 09:24
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hwclass/72406ac02564473ac599 to your computer and use it in GitHub Desktop.
Save hwclass/72406ac02564473ac599 to your computer and use it in GitHub Desktop.
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