Skip to content

Instantly share code, notes, and snippets.

@xeoncross
Forked from PierfrancescoSoffritti/eventBus.js
Created October 9, 2019 15:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xeoncross/0e4aaa16e7705cc77b53d31a6caae273 to your computer and use it in GitHub Desktop.
Save xeoncross/0e4aaa16e7705cc77b53d31a6caae273 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