مُصدِرات الأحداث
جزء من قسم أساسيات Node.js في رحلة Node.js على Coddy. الدرس 20 من 24.
ينبغي للمتجر أن يعلن عن إضافة ملاحظة من دون أن يعرف من يريد سماع ذلك.
يحتفظ EventEmitter من node:events بقائمة من المستمعين لكل اسم حدث. يضيف on(name, fn) مستمعًا؛ ويستدعي emit(name, ...args) كل مستمع لذلك الاسم فورًا، مع تلك الوسائط. أما المستمع الذي يُضاف بعد إصدار الحدث فلا يسمع شيئًا.
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، ثم Ding!لتحويل كائن موجود إلى باعث للأحداث، انسخ أساليبه إليه: Object.assign(new EventEmitter(), { ... }).
التحدي
سهل- اجعل
storeباعثًا يصدرaddedمع نص الملاحظة ورقمها بعد الحفظ. - يستمع
notes.jsإلىaddedويطبعSaved note 4.من المستمع.
شغّل node notes.js add Buy bread. ثم نفّذ clear وأضف ملاحظتين لمشاهدة الأرقام وهي تبدأ من جديد.
جرّب بنفسك
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;
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.