Skip to content

Instantly share code, notes, and snippets.

@nonoroazoro
Created August 23, 2016 11:03
Show Gist options
  • Save nonoroazoro/cd57a62618f867d85e607110c690a502 to your computer and use it in GitHub Desktop.
Save nonoroazoro/cd57a62618f867d85e607110c690a502 to your computer and use it in GitHub Desktop.
A Simple EventEmitter Implemented by JavaScript (ES6)
class EventEmitter
{
constructor()
{
this._listeners = new Map();
}
addListener(p_eventName, p_listener)
{
if (p_listener && typeof p_listener === "function")
{
if (this._listeners.has(p_eventName))
{
this._listeners.get(p_eventName).push(p_listener);
}
else
{
this._listeners.set(p_eventName, [p_listener]);
}
return true;
}
return false;
}
removeListener(p_eventName, p_listener)
{
if (this._listeners.has(p_eventName))
{
const listeners = this._listeners.get(p_eventName);
const index = listeners.lastIndexOf(p_listener);
if (index !== -1)
{
listeners.splice(index, 1);
if (listeners.length === 0)
{
this._listeners.delete(p_eventName);
}
return true;
}
}
return false;
}
emit(p_eventName, ...p_args)
{
if (this._listeners.has(p_eventName))
{
this._listeners.get(p_eventName).forEach((l) => l(...p_args));
return true;
}
return false;
}
on(p_eventName, p_eventHandler)
{
this.addListener(p_eventName, p_eventHandler);
}
off(p_eventName, p_eventHandler)
{
this.removeListener(p_eventName, p_eventHandler);
}
}
const ee = new EventEmitter();
ee.on("click", (e) =>
{
console.log("event data:", e);
});
ee.on("touch", (e) =>
{
console.log("event data:", e);
});
ee.emit("click", {
"A": "Jack"
});
ee.emit("touch", [1, 2, 3]);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment