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.
Tantangan
MudahLangkah 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.
- Di
store.js, jadikanstoresebagaiEventEmitteryang menyimpan semua properti dan metodenya sendiri. ImporEventEmitterdarinode:events.new EventEmitter()membuat pemancar baru yang kosong. Salin objek store ke pemancar itu denganObject.assign, seperti yang ditunjukkan pelajaran. - Di
store.js, dalamadd, setelah catatan disimpan, pancarkan eventaddeddengan dua nilai: teks catatan dan nomornya. - Di
notes.js, dengarkanaddedpada store. Listener mencetakSaved note, nomornya, dan tanda titik. Pasang di dekat bagian atas, sebelum perintah dijalankan, agar listener sudah mendengarkan saataddmemancarkan event. Cabangaddsendiri sekarang tidak mencetak apa pun, cabang itu hanya memanggilstore.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;
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Dasar-Dasar Node.js
1Menjalankan JavaScript di Node
Halo, NodeMembaca PerintahArgumen Baris PerintahPerintah5Peristiwa, Input, dan Package
Dengarkan Sebelum MengirimkanPemancar PeristiwaMembaca InputLatihan sendiri: Playground Express