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.
Aufgabe
EinfachDieser 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.
- Mach in
store.jsstorezu einemEventEmitter, der alle eigenen Eigenschaften und Methoden beibehält. ImportiereEventEmitterausnode:events.new EventEmitter()erstellt einen neuen, leeren Event-Emitter. Kopiere das Objekt des Speichers mitObject.assignauf diesen Event-Emitter, wie in der Lektion gezeigt. - Gib in
store.jsinnerhalb vonadd, nachdem die Notizen gespeichert wurden, einadded-Ereignis mit zwei Werten aus: dem Text der Notiz und ihrer Nummer. - Höre in
notes.jsbeim Speicher aufadded. Der Listener gibtSaved note, die Nummer und einen Punkt aus. Füge ihn weit oben ein, bevor die Befehle ausgeführt werden, damit er bereits zuhört, wennadddas Ereignis ausgibt. Deradd-Zweig selbst gibt jetzt nichts aus; er ruft nurstore.addauf.
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;
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