Menu
CoddyTech

Event-Emitter

Teil des Abschnitts Node.js-Grundlagen der Node.js-Journey von Coddy. Lektion 29 von 33.

Der Store 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 Aufruf von emit hinzugefügt wird, bekommt nichts mit.

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!

new EventEmitter() erstellt einen Emitter, ein Objekt mit den Methoden on und emit. Um einem vorhandenen Objekt diese Methoden zu geben, kopiere seine Eigenschaften auf einen neuen Emitter: Object.assign(new EventEmitter(), { notes: [] }) gibt einen Emitter zurück, der auch notes enthält.

challenge icon

Aufgabe

Einfach

Dieser Schritt öffnet das vorbereitete Projekt des Kurses für ein Befehlszeilenwerkzeug für Notizen und nicht deine Projektdateien aus Timers (einschließlich notes.js). Deine frühere Arbeit bleibt in ihrer eigenen Lektion. Lies die bereitgestellten Dateien, bevor du store.js bearbeitest. Diese Kopie enthält die Notizbefehle und asynchrone Datei-Hilfsfunktionen.

Der Speicher sollte jede neue Notiz ankündigen und anderen Code entscheiden lassen, was damit geschieht. Verwandle den Speicher in einen Event-Emitter.

  1. Mach in store.js store zu einem EventEmitter, der alle eigenen Eigenschaften und Methoden beibehält. Importiere EventEmitter aus node:events. new EventEmitter() erstellt einen neuen, leeren Event-Emitter. Kopiere das Objekt des Speichers mit Object.assign auf diesen Event-Emitter, wie in der Lektion gezeigt.
  2. Gib in store.js innerhalb von add, nachdem die Notizen gespeichert wurden, ein added-Ereignis mit zwei Werten aus: dem Text der Notiz und ihrer Nummer.
  3. Höre in notes.js beim Speicher auf added. Der Listener gibt Saved note , die Nummer und einen Punkt aus. Füge ihn weit oben ein, bevor die Befehle ausgeführt werden, damit er bereits zuhört, wenn add das Ereignis ausgibt. Der add-Zweig selbst gibt jetzt nichts aus; er ruft nur store.add auf.

node notes.js add Buy bread gibt eine Zeile mit der Nummer der neuen Notiz aus, zum Beispiel:

Saved note 3.

Nach clear gibt add Buy milk Saved note 1. aus und add Call Ada gibt Saved note 2. aus.

Probiere es aus: Gib add Buy bread in das Feld nach $ node notes.js ein und drücke die Eingabetaste. Du siehst Saved note und die neue Nummer, ausgegeben von deinem Listener. Gib dann clear, add Buy milk und add Call Ada ein: Du siehst zuerst Saved note 1. und dann Saved note 2..

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

Übe selbstständig: Express-Playground