Menu
CoddyTech

مُصدِرات الأحداث

جزء من قسم أساسيات 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.

challenge icon

التحدي

سهل

تفتح هذه الخطوة مشروع أداة سطر الأوامر للملاحظات الذي أعدّه المقرر، وليس ملفات مشروعك من درس Timers (بما فيها notes.js). يبقى عملك السابق في درسه الخاص. اقرأ الملفات المقدمة قبل تعديل store.js. تحتوي هذه النسخة على أوامر الملاحظات ومساعدات الملفات غير المتزامنة.

ينبغي أن يعلن المخزن عن كل ملاحظة جديدة، وأن يترك للشفرة الأخرى تحديد ما تفعله حيال ذلك. حوّل المخزن إلى مُصدِر أحداث.

  1. في store.js، اجعل store كائن EventEmitter يحتفظ بكل خصائصه وطرقه. استورد EventEmitter من node:events. تنشئ new EventEmitter() مُصدِرًا جديدًا فارغًا. انسخ كائن المخزن إلى ذلك المُصدِر باستخدام Object.assign، كما يوضح الدرس.
  2. في store.js، داخل add، أصدِر حدثًا باسم added بعد حفظ الملاحظات، مع قيمتين: نص الملاحظة ورقمها.
  3. في 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;
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس أساسيات Node.js

تدرّب بنفسك: Playground لـ Express