Reputation: 6378
as subject states, I want to attach events to my objects and trigger its action at future so I can do asynchronous stuff without callbacks and Qs.
I dont want to attach & pollute any particular DOM or the document.
Upvotes: 2
Views: 45
Reputation: 7438
var utils = utils || {};
utils.publishSubscribe = (function() {
var publishSubscribe = {};
// Storage for topics that can be broadcast
// or listened to
var topics = {};
// An topic identifier
var subUid = -1;
// Publish or broadcast events of interest
// with a specific topic name and arguments
// such as the data to pass along
publishSubscribe.publish = function( topic, args ) {
if ( !topics[topic] ) {
return false;
}
var subscribers = topics[topic],
len = subscribers ? subscribers.length : 0;
while (len--) {
subscribers[len].func( topic, args );
}
return this;
};
// Subscribe to events of interest
// with a specific topic name and a
// callback function, to be executed
// when the topic/event is observed
publishSubscribe.subscribe = function( topic, func ) {
if (!topics[topic]) {
topics[topic] = [];
}
var token = ( ++subUid ).toString();
topics[topic].push({
token: token,
func: func
});
return token;
};
// Unsubscribe from a specific
// topic, based on a tokenized reference
// to the subscription
publishSubscribe.unsubscribe = function( token ) {
for ( var m in topics ) {
if ( topics[m] ) {
for ( var i = 0, j = topics[m].length; i < j; i++ ) {
if ( topics[m][i].token === token ) {
topics[m].splice( i, 1 );
return token;
}
}
}
}
return this;
};
return publishSubscribe;
}());
utils.publishSubscribe.subscribe( "inbox/newMessage", function( topic, data ) {
console.log( "A new message was received: ", data );
})
utils.publishSubscribe.publish( "inbox/newMessage", [{
sender: "[email protected]",
body: "Hey there! How are you doing today?"
}]);
source: Addy Osmani – Learning JavaScript Design Patterns
Upvotes: 2