Menu
CoddyTech

Event-Emitter

Teil des Abschnitts Node.js-Grundlagen der Node.js-Journey von Coddy. Lektion 20 von 24.

Der Speicher sollte bekannt geben, dass eine Notiz hinzugefügt wurde, ohne zu wissen, wer davon erfahren möchte.

Ein EventEmitter aus node:events führt für jeden Ereignisnamen eine Liste von Listenern. on(name, fn) fügt einen Listener hinzu; emit(name, ...args) ruft sofort jeden Listener für diesen Namen mit diesen Argumenten auf. Ein Listener, der nach dem Emit hinzugefügt wird, hört nichts.

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 kam herein, dann Ding!

Um ein vorhandenes Objekt in einen Emitter umzuwandeln, kopiere seine Methoden darauf: Object.assign(new EventEmitter(), { ... }).

challenge icon

Aufgabe

Einfach
  • Mache store zu einem Ereignis-Emitter, der nach dem Speichern das Ereignis added mit dem Text und der Nummer der Notiz auslöst.
  • notes.js lauscht auf added und gibt über den Listener Saved note 4. aus.

Führe node notes.js add Buy bread aus. Verwende anschließend clear und füge zwei Notizen hinzu, um zu sehen, wie die Nummerierung wieder von vorn beginnt.

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Node.js-Grundlagen