Menu
CoddyTech

Event Emitter

Termasuk bagian Dasar-Dasar Node.js dalam perjalanan Node.js di Coddy. Pelajaran 20 dari 24.

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

EventEmitter dari node:events menyimpan daftar listener untuk setiap nama event. on(name, fn) menambahkan listener; emit(name, ...args) langsung memanggil setiap listener untuk nama tersebut dengan argumen-argumen itu. Listener yang ditambahkan setelah 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!

Untuk mengubah object yang sudah ada menjadi emitter, salin method-nya ke salah satu emitter: Object.assign(new EventEmitter(), { ... }).

challenge icon

Tantangan

Mudah
  • Buat store menjadi emitter yang memancarkan added dengan teks dan nomor catatan setelah disimpan.
  • notes.js mendengarkan added dan mencetak Saved note 4. dari listener.

Jalankan node notes.js add Buy bread. Lalu clear dan tambahkan dua catatan untuk melihat nomornya mulai lagi.

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