- events work differently than in browser
- events are triggered manually, no browser window that magically triggers events through interaction
- there are no built-in events, everything is created manually
- there are no event objects, can pass arguments to EH when triggering event, event is just event name
- event targets are called event emitters, more accurate name
- there is no event flow
Event emitters
- EM objects are instances of
EventEmitter
eventEmitter.attachListener()
/on()
: adds EH to EM for event name, returns EM so calls can be chained
eventEmitter.removeListener()
/off()
: removes EH from EM for event name, returns EM so calls can be chained
eventEmitter.once()
: adds one-time EH to EM for event name, returns EM so calls can be chained, i.e. like on()
for an EH which calls off()
inside itself
eventEmitter.emit()
: calls EHs for event name synchronously, in order of registration, passing arguments to each, returns boolean if any EHs are attached
const EventEmitter = require("events");
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on("something", () => {
console.log("Reacting to event...");
});
myEmitter.on("error", err => {
console.error("Whoops, an error occurred!", err);
});
myEmitter.emit("something");
myEmitter.emit("error", new Error("Illegal operation."));
Event handlers
- EHs for same event are called sync and in order of attachment, must be non-async functions ❗️
this
inside EH refers to EM which EH is registered on
- return value of EH is ignored
- can attach at most
10
EHs for given event by default, more will output a trace warning to stderr
, can change using eventEmitter.setMaxListeners()
- if EH is attached multiple times for same event and EM, it is called multiple times, needs to be removed multiple times as well ❗️
- on
"error"
event, if no EH is attached, the first argument is thrown, a stack trace is printed, and the Node.js process exits, therefore always attach an error handler ❗️
- removing EHs won’t stop calls for already emitted events
Resources