Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Questo 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.

  1. In store.js, fai in modo che store sia un EventEmitter che conserva tutte le sue proprietà e i suoi metodi. Importa EventEmitter da node:events. new EventEmitter() crea un nuovo emettitore vuoto. Copia l'oggetto dello store su quell'emettitore con Object.assign, come mostra la lezione.
  2. In store.js, in add, dopo aver salvato le note, emetti un evento added con due valori: il testo della nota e il suo numero.
  3. In notes.js, ascolta l'evento added sullo store. Il listener stampa Saved note , il numero e un punto. Collegalo vicino all'inizio, prima che vengano eseguiti i comandi, così sarà già in ascolto quando add emette l'evento. Ora il ramo add non stampa nulla; si limita a chiamare store.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;
quiz iconMettiti alla prova

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