Menu
CoddyTech

Emissores de eventos

Parte da seção Fundamentos de Node.js do Journey de Node.js da Coddy. Lição 29 de 33.

A loja deve anunciar que uma anotação foi adicionada sem saber quem quer ouvi-la.

Um EventEmitter de node:events mantém uma lista de ouvintes para cada nome de evento. on(name, fn) adiciona um ouvinte; emit(name, ...args) chama todos os ouvintes daquele nome imediatamente, com esses argumentos. Um ouvinte adicionado depois da emissão não ouve nada.

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 entrou, depois Ding!

new EventEmitter() cria um emissor, um objeto que tem on e emit. Para dar esses métodos a um objeto existente, copie suas propriedades para um novo emissor: Object.assign(new EventEmitter(), { notes: [] }) retorna um emissor que também tem notes.

challenge icon

Desafio

Fácil

Esta etapa abre o projeto preparado do curso da ferramenta de linha de comando para notas, em vez dos arquivos do seu projeto de Timers (incluindo notes.js). Seu trabalho anterior continua na própria lição. Leia os arquivos fornecidos antes de editar store.js. Esta cópia contém os comandos para notas e auxiliares assíncronos para arquivos.

O armazenamento deve anunciar cada nota nova e deixar que outro código decida o que fazer com ela. Transforme o armazenamento em um emissor de eventos.

  1. Em store.js, faça com que store seja um EventEmitter que mantenha todas as próprias propriedades e métodos. Importe EventEmitter de node:events. new EventEmitter() cria um emissor novo e vazio. Copie o objeto do armazenamento para esse emissor com Object.assign, como a lição mostra.
  2. Em store.js, em add, depois que as notas forem salvas, emita um evento added com dois valores: o texto da nota e o número dela.
  3. Em notes.js, escute o evento added no armazenamento. O listener exibe Saved note , o número e um ponto final. Anexe-o perto do início, antes da execução dos comandos, para que já esteja escutando quando add emitir o evento. O próprio bloco de add não exibe nada agora; ele apenas chama store.add.

node notes.js add Buy bread exibe uma linha com o número da nota nova, por exemplo:

Saved note 3.

Depois de clear, add Buy milk exibe Saved note 1., e add Call Ada exibe Saved note 2..

Experimente: digite add Buy bread na caixa depois de $ node notes.js e pressione Enter. Você verá Saved note e o número novo, exibidos pelo seu listener. Em seguida, digite clear, add Buy milk e add Call Ada: você verá Saved note 1. e, depois, Saved note 2..

Experimente você mesmo

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 seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos de Node.js

Pratique por conta própria: Playground de Express