Skip to content

Instantly share code, notes, and snippets.

@ndaidong
Created October 27, 2022 09:10
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 ndaidong/82288563f5a7b444af4a522d2edbb1b5 to your computer and use it in GitHub Desktop.
Save ndaidong/82288563f5a7b444af4a522d2edbb1b5 to your computer and use it in GitHub Desktop.
Minimal event emitter for web
// EventEmitter.js
export class EventEmitter {
constructor () {
this._events = Object.create(null)
}
// add event listener
on (name, handle) {
const handlers = this._events[name] || []
handlers.push(handle)
this._events[name] = handlers
}
// remove a handler from event listener
// or remove all handlers from event listener
// or clean all events listener
off (name, handle) {
if (!handle) {
this._events[name] = []
return 0
}
if (!name) {
this._events = {}
return 0
}
const handlers = this._events[name] || []
const filtered = handlers.filter(h => h !== handle)
this._events[name] = filtered
return filtered.length
}
// emit an event
// first parameter is event name
// remaining will be passed to handler as its parameters
emit (...args) {
const eventName = args[0]
const handlers = this._events[eventName] || []
const params = args.slice(1)
handlers.forEach((handle) => {
handle.apply(this, params)
})
}
}

Usage

app's event manager

// event.js
import { EventEmitter } from './EventEmitter.js'

export const emitter = new EventEmitter()

at the dashboard

// dashboard.js

import { emitter } from './event.js'

// example handler
const logout = () => {
  localStorage.removeItem('token')
  window.location.replace('/login')
}

// add listener
emitter.on('user-logout', logout)

at another place where we have "Logout" button

// menu.js

import { emitter } from './event.js'

const triggerLogout = () => {
  // update state...
  emitter.emit('user-logout')
}

const buttonLogout = document.getElementById('button_logout')
buttonLogout.addEventListener('click', triggerLogout)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment