Menu
CoddyTech

Pemancar Peristiwa

Termasuk bagian Dasar-Dasar Node.js dalam perjalanan Node.js di Coddy. Pelajaran 29 dari 33.

Toko seharusnya mengumumkan bahwa sebuah catatan telah ditambahkan tanpa mengetahui siapa yang ingin mendengarnya.

EventEmitter dari node:events menyimpan daftar pendengar untuk setiap nama peristiwa. on(name, fn) menambahkan pendengar; emit(name, ...args) langsung memanggil setiap pendengar untuk nama tersebut dengan argumen itu. Pendengar yang ditambahkan setelah pemanggilan emit tidak akan mendengar apa pun.

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 masuk, lalu Ding!

new EventEmitter() membuat emitter, yaitu object yang memiliki on dan emit. Untuk memberikan metode tersebut kepada object yang sudah ada, salin propertinya ke emitter baru: Object.assign(new EventEmitter(), { notes: [] }) mengembalikan emitter yang juga memiliki notes.

challenge icon

Tantangan

Mudah

Langkah ini membuka proyek alat baris perintah catatan yang telah disiapkan untuk kursus, bukan file proyekmu dari Timers (termasuk notes.js). Pekerjaanmu sebelumnya tetap berada di pelajarannya sendiri. Baca file yang disediakan sebelum mengedit store.js. Salinan ini berisi perintah catatan dan fungsi pembantu file asinkron.

Store seharusnya mengumumkan setiap catatan baru dan membiarkan kode lain menentukan tindakan yang akan dilakukan. Ubah store menjadi pemancar event.

  1. Di store.js, jadikan store sebagai EventEmitter yang menyimpan semua properti dan metodenya sendiri. Impor EventEmitter dari node:events. new EventEmitter() membuat pemancar baru yang kosong. Salin objek store ke pemancar itu dengan Object.assign, seperti yang ditunjukkan pelajaran.
  2. Di store.js, dalam add, setelah catatan disimpan, pancarkan event added dengan dua nilai: teks catatan dan nomornya.
  3. Di notes.js, dengarkan added pada store. Listener mencetak Saved note , nomornya, dan tanda titik. Pasang di dekat bagian atas, sebelum perintah dijalankan, agar listener sudah mendengarkan saat add memancarkan event. Cabang add sendiri sekarang tidak mencetak apa pun, cabang itu hanya memanggil store.add.

node notes.js add Buy bread mencetak satu baris dengan nomor catatan baru, seperti:

Saved note 3.

Setelah clear, add Buy milk mencetak Saved note 1., dan add Call Ada mencetak Saved note 2..

Coba: ketik add Buy bread di kotak setelah $ node notes.js, lalu tekan Enter. Kamu akan melihat Saved note dan nomor baru yang dicetak oleh listener-mu. Lalu ketik clear, add Buy milk, dan add Call Ada: kamu akan melihat Saved note 1., lalu Saved note 2..

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Dasar-Dasar Node.js

Latihan sendiri: Playground Express