פולטי אירועים
חלק מהיחידה יסודות 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קריאת הפקודהארגומנטים של שורת הפקודהפקודותתרגלו בעצמכם: Express אונליין