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

תרגלו בעצמכם: Express אונליין