Menu
CoddyTech

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

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

challenge icon

التحدي

سهل
  • اجعل 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;
quiz iconاختبر نفسك

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

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