Menu
CoddyTech

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.

challenge icon

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.

  1. Trong store.js, hãy tạo store thành một EventEmitter nhưng vẫn giữ tất cả thuộc tính và phương thức riêng của nó. Nhập EventEmitter từ node:events. new EventEmitter() tạo một bộ phát sự kiện mới, trống. Dùng Object.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.
  2. Trong store.js, bên trong add, sau khi lưu ghi chú, hãy phát sự kiện added kèm theo hai giá trị: nội dung ghi chú và số thứ tự của nó.
  3. Trong notes.js, hãy lắng nghe sự kiện added trên store. Trình xử lý sự kiện in ra Saved 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 khi add phát sự kiện. Nhánh add giờ không tự in gì nữa, nó chỉ gọi store.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;
quiz iconTự kiểm tra

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

Tự luyện tập: Playground Express