Skip to content

Instantly share code, notes, and snippets.

@AndrewBuntsev
Forked from PierfrancescoSoffritti/eventBus.js
Created December 12, 2019 20:01
Show Gist options
  • Save AndrewBuntsev/987b72f09b9ac51ebf480f78a93ba654 to your computer and use it in GitHub Desktop.
Save AndrewBuntsev/987b72f09b9ac51ebf480f78a93ba654 to your computer and use it in GitHub Desktop.
A simple implementation of an event bus in Javascript. More details here: https://medium.com/@soffritti.pierfrancesco/create-a-simple-event-bus-in-javascript-8aa0370b3969
/**
* subscriptions data format:
* { eventType: { id: callback } }
*/
const subscriptions = { }
const getNextUniqueId = getIdGenerator()
function subscribe(eventType, callback) {
const id = getNextUniqueId()
if(!subscriptions[eventType])
subscriptions[eventType] = { }
subscriptions[eventType][id] = callback
return {
unsubscribe: () => {
delete subscriptions[eventType][id]
if(Object.keys(subscriptions[eventType]).length === 0) delete subscriptions[eventType]
}
}
}
function publish(eventType, arg) {
if(!subscriptions[eventType])
return
Object.keys(subscriptions[eventType]).forEach(key => subscriptions[eventType][key](arg))
}
function getIdGenerator() {
let lastId = 0
return function getNextUniqueId() {
lastId += 1
return lastId
}
}
module.exports = { publish, subscribe }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment