Skip to content

Instantly share code, notes, and snippets.

@oleh-zaporozhets
Last active January 16, 2023 07:25
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save oleh-zaporozhets/bfec05c6de0e72578000e9ad9ec79fbf to your computer and use it in GitHub Desktop.
Save oleh-zaporozhets/bfec05c6de0e72578000e9ad9ec79fbf to your computer and use it in GitHub Desktop.
class MyEventEmitter {
constructor() {
this._events = {};
}
on(name, listener) {
if (!this._events[name]) {
this._events[name] = [];
}
this._events[name].push(listener);
}
removeListener(name, listenerToRemove) {
if (!this._events[name]) {
throw new Error(`Can't remove a listener. Event "${name}" doesn't exits.`);
}
const filterListeners = (listener) => listener !== listenerToRemove;
this._events[name] = this._events[name].filter(filterListeners);
}
emit(name, data) {
if (!this._events[name]) {
throw new Error(`Can't emit an event. Event "${name}" doesn't exits.`);
}
const fireCallbacks = (callback) => {
callback(data);
};
this._events[name].forEach(fireCallbacks);
}
}
@Kepro
Copy link

Kepro commented Nov 2, 2021

typescript version

export default class EventEmitter {
  private readonly events: Record<string, ((data: unknown) => void)[]> = {};

  on(name: string, listener: (data?: unknown) => void) {
    if (!this.events[name]) this.events[name] = [];

    this.events[name].push(listener);
  }

  removeListener(name: string, listenerToRemove: (data?: unknown) => void) {
    if (!this.events[name]) {
      throw new Error(`Can't remove a listener. Event "${name}" doesn't exits.`);
    }

    const filterListeners = (listener: (data?: unknown) => void) => listener !== listenerToRemove;

    this.events[name] = this.events[name].filter(filterListeners);
  }

  emit(name: string, data?: unknown) {
    if (!this.events[name]) {
      throw new Error(`Can't emit an event. Event "${name}" doesn't exits.`);
    }

    this.events[name].forEach((cb) => cb(data));
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment