Défi
Énoncé
Implémenter une classe EventEmitter disposant de trois méthodes : on(event, fn) enregistre un gestionnaire pour un événement nommé, emit(event, ...args) appelle tous les gestionnaires enregistrés pour cet événement avec les arguments fournis, off(event, fn) désenregistre un gestionnaire précis. Plusieurs gestionnaires peuvent coexister pour le même événement. Pas de module events de Node.js ni de dépendance externe.
Contraintes
- ES2015+ (Node.js 18 ou navigateur moderne).
- Pas d'import de
require("events")ni d'aucune bibliothèque. offdoit retirer uniquement le gestionnaire passé en argument (comparaison par référence), pas tous ceux de l'événement.emitne lève pas d'exception si aucun gestionnaire n'est enregistré pour l'événement.- Le stockage interne des gestionnaires est laissé au choix (
Map, objet, etc.).
Exemple
class EventEmitter {
constructor() {
this._handlers = new Map();
}
on(event, fn) {
if (!this._handlers.has(event)) this._handlers.set(event, []);
this._handlers.get(event).push(fn);
}
off(event, fn) {
const liste = this._handlers.get(event) ?? [];
this._handlers.set(event, liste.filter((h) => h !== fn));
}
emit(event, ...args) {
(this._handlers.get(event) ?? []).forEach((h) => h(...args));
}
}
const emitter = new EventEmitter();
const saluer = (nom) => console.log(`Bonjour, ${nom} !`);
emitter.on("salut", saluer);
emitter.emit("salut", "Alice");
emitter.off("salut", saluer);
emitter.emit("salut", "Bob");
Bonjour, Alice !
Le second emit ne produit aucune sortie car saluer a été désenregistré.