Emitter di eventi
Fa parte della sezione Fondamenti di Node.js del percorso Node.js di Coddy. Lezione 29 di 33.
Il negozio dovrebbe annunciare che è stata aggiunta una nota senza sapere chi vuole ascoltarlo.
Un EventEmitter da node:events mantiene un elenco di ascoltatori per ogni nome di evento. on(name, fn) aggiunge un ascoltatore; emit(name, ...args) chiama subito ogni ascoltatore associato a quel nome, passando quegli argomenti. Un ascoltatore aggiunto dopo l’emissione non sente nulla.
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 è entrata, poi Ding!new EventEmitter() crea un emettitore, un oggetto che ha on e emit. Per assegnare questi metodi a un oggetto esistente, copia le sue proprietà su un nuovo emettitore: Object.assign(new EventEmitter(), { notes: [] }) restituisce un emettitore che ha anche notes.
Sfida
FacileQuesto passaggio apre il progetto dello strumento da riga di comando per le note preparato per il corso, anziché i file del tuo progetto di Timers (incluso notes.js). Il lavoro precedente resta nella sua lezione. Leggi i file forniti prima di modificare store.js. Questa copia contiene i comandi per le note e le funzioni helper asincrone per i file.
Lo store dovrebbe annunciare ogni nuova nota e lasciare che sia altro codice a decidere cosa fare. Trasforma lo store in un emettitore di eventi.
- In
store.js, fai in modo chestoresia unEventEmitterche conserva tutte le sue proprietà e i suoi metodi. ImportaEventEmitterdanode:events.new EventEmitter()crea un nuovo emettitore vuoto. Copia l'oggetto dello store su quell'emettitore conObject.assign, come mostra la lezione. - In
store.js, inadd, dopo aver salvato le note, emetti un eventoaddedcon due valori: il testo della nota e il suo numero. - In
notes.js, ascolta l'eventoaddedsullo store. Il listener stampaSaved note, il numero e un punto. Collegalo vicino all'inizio, prima che vengano eseguiti i comandi, così sarà già in ascolto quandoaddemette l'evento. Ora il ramoaddnon stampa nulla; si limita a chiamarestore.add.
node notes.js add Buy bread stampa una riga con il numero della nuova nota, ad esempio:
Saved note 3.Dopo clear, add Buy milk stampa Saved note 1. e add Call Ada stampa Saved note 2..
Prova: digita add Buy bread nel riquadro dopo $ node notes.js e premi Invio. Vedrai Saved note e il nuovo numero, stampati dal tuo listener. Poi digita clear, add Buy milk e add Call Ada: vedrai Saved note 1. e poi Saved note 2..
Provalo tu
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;
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti di Node.js
Esercitati da solo: Playground Express