Emitery zdarzeń
Część sekcji Podstawy Node.js ścieżki Node.js w Coddy. Lekcja 29 z 33.
Sklep powinien informować o dodaniu notatki, nie wiedząc, kto chce o tym usłyszeć.
EventEmitter z node:events przechowuje listę nasłuchujących dla każdej nazwy zdarzenia. on(name, fn) dodaje nasłuchującego; emit(name, ...args) natychmiast wywołuje każdego nasłuchującego dla tej nazwy, przekazując mu te argumenty. Nasłuchujący dodany po wyemitowaniu zdarzenia niczego nie usłyszy.
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 weszła, a potem Ding!new EventEmitter() tworzy emiter, czyli obiekt, który ma metody on i emit. Aby nadać istniejącemu obiektowi te metody, skopiuj jego właściwości do nowego emitera: Object.assign(new EventEmitter(), { notes: [] }) zwraca emiter, który ma również właściwość notes.
Wyzwanie
ŁatwyTen krok otwiera przygotowany w kursie projekt narzędzia wiersza poleceń do obsługi notatek, a nie pliki projektu z lekcji Timers (w tym notes.js). Twoja wcześniejsza praca pozostaje w swojej lekcji. Przed edycją pliku store.js przeczytaj dostarczone pliki. Ta kopia zawiera polecenia do obsługi notatek oraz asynchroniczne funkcje pomocnicze do pracy z plikami.
Magazyn powinien informować o każdej nowej notatce, a pozostały kod powinien decydować, co z tym zrobić. Zmień magazyn w emiter zdarzeń.
- W pliku
store.jsspraw, abystorebył obiektemEventEmitter, który zachowuje wszystkie swoje właściwości i metody. ZaimportujEventEmitterznode:events.new EventEmitter()tworzy nowy, pusty emiter. Skopiuj obiekt magazynu do tego emitera za pomocąObject.assign, tak jak pokazano w lekcji. - W pliku
store.js, w metodzieadd, po zapisaniu notatek wyemituj zdarzenieaddedz dwiema wartościami: tekstem notatki i jej numerem. - W pliku
notes.jsnasłuchuj zdarzeniaaddedw magazynie. Nasłuchujący wypisujeSaved note, numer i kropkę. Dodaj go blisko początku pliku, zanim zostaną uruchomione polecenia, aby już nasłuchiwał, gdyaddwyemituje zdarzenie. Sama gałąźaddnic teraz nie wypisuje — wywołuje tylkostore.add.
node notes.js add Buy bread wypisuje jeden wiersz z numerem nowej notatki, na przykład:
Saved note 3.Po użyciu clear polecenie add Buy milk wypisuje Saved note 1., a add Call Ada wypisuje Saved note 2..
Wypróbuj: wpisz add Buy bread w polu po $ node notes.js i naciśnij Enter. Zobaczysz Saved note i nowy numer, wypisane przez nasłuchujący. Następnie wpisz clear, add Buy milk i add Call Ada: zobaczysz najpierw Saved note 1., a potem Saved note 2..
Spróbuj swoich sił
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;
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy Node.js
1Uruchamianie JavaScript w Node
Witaj, NodeOdczytywanie poleceniaArgumenty wiersza poleceńPolecenia5Zdarzenia, dane wejściowe i pakiety
Nasłuchuj przed emisjąEmitery zdarzeńOdczytywanie danych wejściowychPoćwicz samodzielnie: Edytor online Express