JSFiddle - React, Tailwind, and code Playground
JavaScript
(function(window) {
var token = 0,
topics = {},
Publisher, Subscriber,
Subscription = function(topic, func) {
this.token = token++;
this.topic = topic;
this.func = func;
},
pubsub = Object.create({
subscribe: function(topic, func) {
var sub = new Subscription(topic, func);
topics[topic] = topics[topic] || [];
topics[topic].push(sub);
return sub;
},
subscribe_once: function(topic, func) {
var sub = pubsub.subscribe(topic, func),
old_func = sub.func;
// rewrite our subscription's method to remove itself after invocation
sub.func = function() {
// call the original function
old_func.apply(this);
// remove subscription from topic
pubsub.unsubscribe(sub);
};
return sub;
},
unsubscribe: function(subscription) {
console.log('calling unsubscribe');
// iterate through the topic to which the given subscription belongs,
// when we find a match, return a list of subscriptions minus the match
topics[subscription.topic] = _.reject(topics[subscription.topic], function(sub) {
return subscription.token === sub.token;
});
},
publish: function(topic, context) {
console.log('topics["someevent"] contains elements here', topics[topic]);
console.log('but not here', topics);
_.each(topics[topic], function(subscription) {
subscription.func.apply({
context: context
});
});
}
});
// these are basically interfaces
...