Menu
CoddyTech

Émetteurs d’événements

Fait partie de la section Les bases de Node.js du Journey Node.js de Coddy. Leçon 29 sur 33.

Le magasin doit annoncer qu’une note a été ajoutée sans savoir qui souhaite l’entendre.

Un EventEmitter de node:events conserve une liste d’écouteurs pour chaque nom d’événement. on(name, fn) ajoute un écouteur ; emit(name, ...args) appelle immédiatement tous les écouteurs associés à ce nom, avec ces arguments. Un écouteur ajouté après l’émission ne reçoit rien.

import { EventEmitter } from 'node:events';

const door = new EventEmitter();
door.on('open', (who) => console.log(`${who} came in`));
door.on('open', () => console.log('Ding!'));
door.emit('open', 'Ada');
// Ada est entrée, puis Ding!

new EventEmitter() crée un émetteur, un objet qui possède on et emit. Pour donner ces méthodes à un objet existant, copie ses propriétés dans un nouvel émetteur : Object.assign(new EventEmitter(), { notes: [] }) renvoie un émetteur qui possède aussi notes.

challenge icon

Défi

Facile

Cette étape ouvre le projet préparé de l’outil de notes en ligne de commande du cours, plutôt que les fichiers de ton projet de Timers (y compris notes.js). Ton travail précédent reste dans sa propre leçon. Lis les fichiers fournis avant de modifier store.js. Cette copie contient les commandes de notes et les fonctions auxiliaires asynchrones pour les fichiers.

Le magasin doit annoncer chaque nouvelle note et laisser les autres parties du code décider quoi en faire. Transforme le magasin en émetteur d’événements.

  1. Dans store.js, fais de store un EventEmitter qui conserve toutes ses propriétés et méthodes. Importe EventEmitter depuis node:events. new EventEmitter() crée un nouvel émetteur vide. Copie l’objet du magasin sur cet émetteur avec Object.assign, comme le montre la leçon.
  2. Dans store.js, dans add, après avoir enregistré les notes, émets un événement added avec deux valeurs : le texte de la note et son numéro.
  3. Dans notes.js, écoute l’événement added sur le magasin. Le gestionnaire affiche Saved note , le numéro et un point. Ajoute-le près du début, avant l’exécution des commandes, pour qu’il écoute déjà lorsque add émet l’événement. La branche add n’affiche plus rien elle-même ; elle appelle uniquement store.add.

node notes.js add Buy bread affiche une ligne avec le numéro de la nouvelle note, par exemple :

Saved note 3.

Après clear, add Buy milk affiche Saved note 1., et add Call Ada affiche Saved note 2..

Essaie : saisis add Buy bread dans la boîte après $ node notes.js et appuie sur Entrée. Tu vois Saved note et le nouveau numéro, affichés par ton gestionnaire. Ensuite, saisis clear, add Buy milk et add Call Ada : tu vois Saved note 1., puis Saved note 2..

Essayez vous-même

import { existsSync } from 'node:fs';
import { readFile, writeFile } from 'node:fs/promises';

const file = 'notes.json';

const readJson = async (name, fallback) => {
    if (!existsSync(name)) {
        return fallback;
    }
    try {
        return JSON.parse(await readFile(name, 'utf8'));
    } catch (err) {
        console.error(`${name} is damaged: ${err.message}`);
        process.exit(1);
    }
};

const [notes, settings] = await Promise.all([readJson(file, []), readJson('settings.json', {})]);

const store = {
    notes,
    settings,
    async save() {
        await writeFile(file, JSON.stringify(this.notes, null, 2));
    },
    async add(text) {
        this.notes.push(text);
        await this.save();
        return this.notes.length;
    },
    async remove(n) {
        const [text] = this.notes.splice(n - 1, 1);
        await this.save();
        return text;
    },
};

export default store;
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Les bases de Node.js

Entraînez-vous par vous-même : Playground Express