JSFiddle - React, Tailwind, and code Playground

by Augustus Yuan

JavaScript

'use strict'
var pubSub = {};
var topicsMap = {};
(function(obj) {
  let id = -1; 
  obj.publish = function(topic, args) {
    if (!topicsMap[topic]) {
      return false;
    }
    let subscribers = topicsMap[topic],
        length = subscribers ? subscribers.length : 0;
    while (length--) {
       subscribers[length].func(args);
    }
    return this;
  };
  obj.subscribe = function(topic, func) {
    if (!topicsMap[topic]) {
      topicsMap[topic] = [];
    }
    topicsMap[topic].push({
      id: (++id),
      func
    });
    return this;
  };
  obj.unsubscribe = function(topic) {
    delete topicsMap[topic];
  };
})(pubSub);

pubSub.subscribe('lol', function(args) {
  console.log('hey 1');
});

pubSub.publish('lol', 'blarrgh');
pubSub.publish('rawr', 'blargh2');
console.log(topicsMap);

pubSub.subscribe('rawr', function(args) {
  console.log(this);
});
pubSub.publish('rawr', 'hello', 'goodbye');
console.log(topicsMap);
pubSub.unsubscribe('lol');
console.log(topicsMap);

pubSub.subscribe('rawr', function(args) {
  console.log('rawr 2');
});

pubSub.publish('rawr', 'hello', 'goodbye');
pubSub.publish('rawr', 'hello').publish('rawr', 'goodbye');