Bộ phát sự kiện
Thuộc phần Kiến thức cơ bản về Node.js trong hành trình Node.js của Coddy. Bài học 29 trên 33.
Cửa hàng nên thông báo rằng một ghi chú đã được thêm vào mà không cần biết ai muốn nghe thông báo đó.
EventEmitter từ node:events lưu danh sách người lắng nghe (listener) cho từng tên sự kiện. on(name, fn) thêm một người lắng nghe; emit(name, ...args) gọi ngay tất cả người lắng nghe cho tên đó, cùng với các đối số ấy. Người lắng nghe được thêm vào sau khi gọi emit sẽ không nghe thấy gì.
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 bước vào, rồi Ding!new EventEmitter() tạo một emitter, một đối tượng có on và emit. Để thêm các phương thức đó vào một đối tượng hiện có, hãy sao chép các thuộc tính của nó lên một emitter mới: Object.assign(new EventEmitter(), { notes: [] }) trả về một emitter cũng có notes.
Thử thách
DễBước này mở dự án công cụ dòng lệnh quản lý ghi chú đã chuẩn bị sẵn cho khóa học, chứ không mở các tệp dự án của bạn trong Timers (bao gồm cả notes.js). Phần bạn đã làm trước đó vẫn nằm trong bài học riêng. Hãy đọc các tệp được cung cấp trước khi chỉnh sửa store.js. Bản sao này có các lệnh quản lý ghi chú và những hàm hỗ trợ tệp bất đồng bộ.
Store cần thông báo mỗi khi có ghi chú mới và để phần code khác quyết định sẽ làm gì với thông báo đó. Hãy biến store thành một bộ phát sự kiện.
- Trong
store.js, hãy tạostorethành mộtEventEmitternhưng vẫn giữ tất cả thuộc tính và phương thức riêng của nó. NhậpEventEmittertừnode:events.new EventEmitter()tạo một bộ phát sự kiện mới, trống. DùngObject.assignđể sao chép đối tượng store vào bộ phát sự kiện đó, như bài học hướng dẫn. - Trong
store.js, bên trongadd, sau khi lưu ghi chú, hãy phát sự kiệnaddedkèm theo hai giá trị: nội dung ghi chú và số thứ tự của nó. - Trong
notes.js, hãy lắng nghe sự kiệnaddedtrên store. Trình xử lý sự kiện in raSaved note, số thứ tự và một dấu chấm. Gắn trình xử lý ở gần đầu tệp, trước khi chạy các lệnh, để nó sẵn sàng lắng nghe khiaddphát sự kiện. Nhánhaddgiờ không tự in gì nữa, nó chỉ gọistore.add.
node notes.js add Buy bread in ra một dòng có số thứ tự của ghi chú mới, chẳng hạn:
Saved note 3.Sau khi chạy clear, lệnh add Buy milk in ra Saved note 1., còn lệnh add Call Ada in ra Saved note 2..
Thử nhé: nhập add Buy bread vào ô sau $ node notes.js rồi nhấn Enter. Bạn sẽ thấy Saved note cùng số thứ tự mới, do trình xử lý sự kiện in ra. Sau đó, nhập clear, add Buy milk và add Call Ada: bạn sẽ thấy Saved note 1., rồi Saved note 2..
Tự làm thử
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;
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Kiến thức cơ bản về Node.js
1Chạy JavaScript trên Node
Xin chào, NodeĐọc lệnhĐối số dòng lệnhCác lệnhTự luyện tập: Playground Express