Генераторы событий
Часть раздела Основы Node.js путешествия по Node.js на Coddy. Урок 20 из 24.
Хранилище должно сообщать о добавлении заметки, не зная, кто хочет об этом услышать.
EventEmitter из node:events хранит список слушателей для каждого имени события. on(name, fn) добавляет слушателя; emit(name, ...args) сразу вызывает каждого слушателя для этого имени, передавая ему эти аргументы. Слушатель, добавленный после вызова emit, ничего не услышит.
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, затем прозвучало Ding!Чтобы превратить существующий объект в эмиттер, скопируй его методы в новый: Object.assign(new EventEmitter(), { ... }).
Задание
Легко- Сделай
storeэмиттером, который после сохранения генерирует событиеaddedс текстом заметки и её номером. notes.jsобрабатывает событиеaddedи выводитSaved note 4.из обработчика.
Запусти node notes.js add Buy bread. Затем выполни clear и добавь две заметки, чтобы увидеть, как нумерация начинается заново.
Попробуйте сами
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;
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы Node.js
1Запуск JavaScript в Node
Знакомство с NodeАргументы командной строкиКоманды