مُصدِرات الأحداث
جزء من قسم أساسيات Node.js في رحلة Node.js على Coddy. الدرس 29 من 33.
ينبغي للمتجر أن يعلن عن إضافة ملاحظة من دون أن يعرف من يريد سماع ذلك.
يحتفظ EventEmitter من node:events بقائمة من المستمعين لكل اسم حدث. تضيف on(name, fn) مستمعًا؛ وتستدعي emit(name, ...args) كل مستمع لذلك الاسم فورًا، مع تلك الوسائط. لا يسمع المستمع الذي أُضيف بعد استدعاء emit أي شيء.
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!تنشئ new EventEmitter() باعثًا، وهو كائن لديه on وemit. لمنح كائن موجود هذه الأساليب، انسخ خصائصه إلى باعث جديد: تعيد Object.assign(new EventEmitter(), { notes: [] }) باعثًا لديه أيضًا notes.
التحدي
سهلتفتح هذه الخطوة مشروع أداة سطر الأوامر للملاحظات الذي أعدّه المقرر، وليس ملفات مشروعك من درس Timers (بما فيها notes.js). يبقى عملك السابق في درسه الخاص. اقرأ الملفات المقدمة قبل تعديل store.js. تحتوي هذه النسخة على أوامر الملاحظات ومساعدات الملفات غير المتزامنة.
ينبغي أن يعلن المخزن عن كل ملاحظة جديدة، وأن يترك للشفرة الأخرى تحديد ما تفعله حيال ذلك. حوّل المخزن إلى مُصدِر أحداث.
- في
store.js، اجعلstoreكائنEventEmitterيحتفظ بكل خصائصه وطرقه. استوردEventEmitterمنnode:events. تنشئnew EventEmitter()مُصدِرًا جديدًا فارغًا. انسخ كائن المخزن إلى ذلك المُصدِر باستخدامObject.assign، كما يوضح الدرس. - في
store.js، داخلadd، أصدِر حدثًا باسمaddedبعد حفظ الملاحظات، مع قيمتين: نص الملاحظة ورقمها. - في
notes.js، استمع إلى الحدثaddedعلى المخزن. تطبع دالة الاستماعSaved note، ثم الرقم، ثم نقطة. أرفقها بالقرب من أعلى الملف، قبل تنفيذ الأوامر، لكي تكون مستمعة بالفعل عند إصدارaddللحدث. لا يطبع فرعaddنفسه أي شيء الآن؛ بل يستدعيstore.addفقط.
يطبع node notes.js add Buy bread سطرًا واحدًا يتضمن رقم الملاحظة الجديدة، مثل:
Saved note 3.بعد clear، يطبع add Buy milk الرمز Saved note 1.، ويطبع add Call Ada الرمز Saved note 2..
جرّب ذلك: اكتب add Buy bread في المربع بعد $ node notes.js واضغط على Enter. سترى Saved note والرقم الجديد، مطبوعَين بواسطة دالة الاستماع. ثم اكتب clear، وadd Buy milk، وadd Call Ada: سترى Saved note 1.، ثم Saved note 2..
جرّب بنفسك
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;
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس أساسيات Node.js
1تشغيل JavaScript على Node
مرحبًا يا Nodeقراءة الأمروسائط سطر الأوامرالأوامرتدرّب بنفسك: Playground لـ Express