This would be simple example of event dispatching system
class BusEvent {
eventName = null;
callbacks = [];
constructor(eventName) {
this.eventName = eventName;
}
register(callback) {
this.callbacks.push(callback);
}
unregister(callback) {
const index = this.callbacks.indexOf(callback);
if (index > -1) {
this.callbacks.splice(index, 1);
}
}
execute(data) {
const callbacks = this.callbacks.slice(0);
callbacks.forEach((callback) => {
callback(data);
});
}
}
class MessageBus {
constructor() {
this.events = {};
}
dispatch(eventName, data) {
const event = this.events[eventName];
if (event) {
event.execute(data);
}
}
on(eventName, callback) {
let event = this.events[eventName];
if (!event) {
event = new BusEvent(eventName);
this.events[eventName] = event;
}
event.register(callback);
}
off(eventName, callback) {
const event = this.events[eventName];
if (event && event.callbacks.indexOf(callback) > -1) {
event.unregister(callback);
if (event.callbacks.length === 0) {
delete this.events[eventName];
}
}
}
}
Usage:
const messageBus = new MessageBus();
messageBus.on('ReceiveData', (data) => {
console.log(data);
})
messageBus.dispatch('ReceiveData', { name: 'Ted' });
// console logs { name: 'Ted' }