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.
Desafio
FácilEsta 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.
- Em
store.js, faça com questoreseja umEventEmitterque mantenha todas as próprias propriedades e métodos. ImporteEventEmitterdenode:events.new EventEmitter()cria um emissor novo e vazio. Copie o objeto do armazenamento para esse emissor comObject.assign, como a lição mostra. - Em
store.js, emadd, depois que as notas forem salvas, emita um eventoaddedcom dois valores: o texto da nota e o número dela. - Em
notes.js, escute o eventoaddedno armazenamento. O listener exibeSaved 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 quandoaddemitir o evento. O próprio bloco deaddnão exibe nada agora; ele apenas chamastore.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;
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