Le module Events va permettre de créer et manipuler un des éléments les plus importants de Node.js: l’Event Emitter (il y a aussi depuis peu Event Target qui est une API compatible avec le navigateur).
Les différents modules de Node.js comme HTTP, Net, Child process ainsi que les Streams sont majoritairement construits à l’aide d’Event Emitter.
const fs = require("node:fs");
const stream = fs.createReadStream("./myFile.txt");
stream.on("data", (chunk) => console.log(chunk));
stream.on("end", () => console.log("stream finished!"));
stream.on("error", console.error);
Exemple ci-dessus avec un Read Stream ou nous exploitons les évènements “data”, “end” ou encore “error” (merci de pas reproduire ce code en production ^^).
Ce sont des structures complètement Synchrone dans lesquelles nous pouvons lier un nom d’évènement (emitter) à une ou plusieurs functions (listeners). Les évènements qui seront émis sont gérés en FIFO (First in First out).
Cela va nous permettre de mettre en place diverses patterns ou le code fonctionnera par le biais de communication entre différents objets.
import { EventEmitter, once } from "node:events";
const ee = new EventEmitter();
setImmediate(() => ee.emit("foo", "hello world!"));
const [message] = await once(ee, "foo");
console.log(message);
Une class en JavaScript peut s'étendre d’un EventEmitter.
import { EventEmitter } from "node:events";
class User extends EventEmitter {
sayHello() {
this.emit("hello");
}
}
const bob = new User();
bob.on("hello", () => console.log("bob say hello!"));
bob.sayHello();
C’est pratique si vous voulez construire un système modulaire ou différent objets (class) communiquent par le biais de messages (les Addons dans SlimIO utilisent beaucoup ce principe).
Il est aussi bon de noter que depuis quelques versions la méthode “on” d'events est AsyncIterable.
import { EventEmitter, on } from "node:events";
const ee = new EventEmitter();
setImmediate(() => {
ee.emit("data", "foo");
ee.emit("data", "bar");
});
for await (const [data] of on(ee, "data")) {
console.log(data);
}
Note
Node.js supporte maintenant aussi l'API Web EventTarget
⬅️ 🌟 Les différents modules core: Console | ➡️ 🌟 Les différents modules core: Path