Aller au contenu principal
U/
Idiomes
javascript

Implémenter un EventEmitter on / emit / off

Écrire une classe EventEmitter avec les méthodes on, emit et off sans dépendance externe, puis démontrer son bon fonctionnement.

60 minPublié le 20 mai 2026Proposé par Anonyme

Défi

// Lisez attentivement, codez sur votre machine

É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.
  • off doit retirer uniquement le gestionnaire passé en argument (comparaison par référence), pas tous ceux de l'événement.
  • emit ne 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é.

Espace solution

Proposer une solution

Connectez-vous ou créez un compte pour envoyer votre code (aucune exécution côté serveur — on stocke juste le texte pour la communauté).

// À garder en tête
  • D'abord, faire marcher

    On ne cherche pas à optimiser : d'abord, on fait marcher le truc. Optimiser vient ensuite — et ça aussi, ça s'apprend. (Si un défi porte sur l'optimisation, son énoncé le précise.)

  • Pas de mauvaise réponse

    Il n'y a pas de mauvaise réponse à un défi. Le but, c'est de le faire. Ce qui compte, c'est de s'entraîner.

  • Trop dur ? Au suivant

    Un défi te résiste ? N'hésite pas à en prendre un autre. Ils seront encore là demain.