Menu
CoddyTech

Emisores de eventos

Parte de la sección Conceptos básicos de Node.js del Journey de Node.js de Coddy. Lección 20 de 24.

La tienda debería anunciar que se añadió una nota sin saber quién quiere enterarse.

Un EventEmitter de node:events mantiene una lista de oyentes para cada nombre de evento. on(name, fn) añade un oyente; emit(name, ...args) llama enseguida a todos los oyentes de ese nombre, con esos argumentos. Un oyente añadido después de la emisión no oye nada.

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 entró, luego Ding!

Para convertir un objeto existente en un emisor, copia sus métodos en uno: Object.assign(new EventEmitter(), { ... }).

challenge icon

Desafío

Fácil
  • Haz que store sea un emisor que emita added con el texto y el número de la nota después de guardarla.
  • notes.js escucha added e imprime Saved note 4. desde el listener.

Ejecuta node notes.js add Buy bread. Después, usa clear y añade dos notas para ver que la numeración empieza de nuevo.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Conceptos básicos de Node.js