אינטרנט ישראל
  • ראשי
  • אודות רן בר-זיק ואינטרנט ישראל
  • ערוץ טלגרם
  • מסטודון
  • התחברו אלי בטוויטר
  • התחברו אלי בלינקדאין
  • ספר ג'אווהסקריפט
  • ראשי
  • אודות רן בר-זיק ואינטרנט ישראל
  • ערוץ טלגרם
  • מסטודון
  • התחברו אלי בטוויטר
  • התחברו אלי בלינקדאין
  • ספר ג'אווהסקריפט
ראשי » מדריכים » Node.js » מדריך Node.js: מודלים בסיסיים: אירועים

מדריך Node.js: מודלים בסיסיים: אירועים

רן בר-זיק נובמבר 4, 2014 7:27 am 3 תגובות

כך יוצרים פונקציות שמאזינות לאירועים ויורים את האירועים ב-Node.js

כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.

אוהבים את מדריך Node.js? רוצים לדעת עוד?

ספר מקיף על Node.js, בעברית, שנכתב על ידי רן בר-זיק וכולל תרגילים רבים ומידע מקיף - גם על מודולים אסינכרוניים וגם על CLI וסטרימים ומידע רב יותר על Node.js ניתן להורדה ממש פה.
כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.

במאמר הקודם למדנו איך משתמשים במודול בסיסי: http. במאמר הזה אנו נלמד על אירועים ב-Node.js. אירועים ב-Node.js הם אחד הדברים החשובים ביותר שאפשר ללמוד. באופן עקרוני, עם eventEmitters אנחנו יכולים ליצור אירועים שאפשר 'להאזין' להם לצרכים שונים. כך למשל, אני יכול 'להאזין' לאירוע יצירת משתמש ומיד אחרי שהוא נוצר לעשות שליחת מייל (למשל). למה לא לעשות את זה עם callbacks?כי שימוש נבון באירועים יכול למנוע מאיתנו את חגיגת ה-callbackים ורמות מטורפות ל nesting. לא מעט מודולים עושים טריגר לאירועים שונים ומשונים ובמקום חגיגת callbacks אפשר פשוט להאזין לאירועים.

השימוש באירועים הוא ממש פשוט. אפשר גם להסתכל על הדוקומנטציה שמכילה את כל המתודות של Events.

ה-require של events צריך להתבצע, כך לפי הדוקומנטציה, באופן הבא:


require('events').EventEmitter.

בואו ונניח שאני רוצה ליצור אירוע – קודם אני אעשה instance ל-class באופן הבא:


var ee = new EventEmitter();

ואז פשוט להפעיל את האירוע על ידי מתודת emit!


ee.emit("myEvent");

מהרגע הזה, כל פונקציה מאזינה שנמצאת בקוד – ולא משנה היכן בקוד, תופעל. אם הפונקציה שיוצרת את האירוע נמצאת במודול, גם אם הפונקציה שמאזינה נמצאת במודול אחר (שעשינו לו require כמובן), אז הפונקציה המאזינה תתפוס את האירוע. גם אם המודול נקרא הרבה אחרי שהמודול שלנו הופעל – פונקצית ההאזנה תפעל.

איך נראית פונקציה שמאזינה? מאוד פשוט:


var EventEmitter = require("events").EventEmitter;
var ee = new EventEmitter();

ee.on("myEvent", function () {
    console.log("event has occured!");
});

ראשית אני מבצע instance ל-events ואז אני משתמש במתודת on כדי להאזין לאירוע שאותו אני מעביר כארגומנט. הארגומנט השני הוא פונקציה אנונימית שמופעלת כאשר מתבצעת הקריאה.

אנו יכולים להעביר כמובן ארגומנטים באירוע שלנו. הנה דוגמה:


var EventEmitter = require("events").EventEmitter;

var ee = new EventEmitter();

/* create listener */
ee.on("myEvent", function (arg1, arg2) {
    console.log("event has occured!");
    console.log("here are the arg1: "+arg1);
    console.log("here are the arg2: "+arg2);
});

/*activating the event */
ee.emit("myEvent",'arg1','arg2');

שימו לב שההאזנה יכולה להתבצע בכל מקום! ה: ee.on יכול להיות בכל מקום! איזה כיף! תעתיקו ותדביקו את הקוד שלעיל ותריצו אותו. נסו להעביר כארגומנטים גם אובייקטים או מערכים ותראו שהם עוברים. מעולה! שווה לתרגל.

הצצה בדוקומנטציה מראה עוד כמה מתודות שוות במיוחד – למשל once – מתודת האזנה שמופעלת פעם אחת בלבד! למשל – כאן אני משתמש ב-once ויורה את האירוע פעמיים. אם אני אריץ את הקוד הזה אני אראה שהפונקציה המאזינה תרוץ רק פעם אחת בלבד ולא פעמיים.

(זוכרים איך להריץ, נכון?? להעתיק, להדביק בקובץ whatever.js ואז להריץ בקונסולה או ב-cmd ככה: nodejs whatever.js).


var EventEmitter = require("events").EventEmitter;

var ee = new EventEmitter();

/* create listener - will not work more than once */
ee.once("myEvent", function (arg1, arg2) {
    console.log("event has occured!");
    console.log("here are the arg1: "+arg1);
    console.log("here are the arg2: "+arg2);
});


/*activating the event */
ee.emit("myEvent",'arg1','arg2');

/*activating the event 2nd time */
ee.emit("myEvent",'arg1','arg2');

אפשר גם לקבל את רשימת המאזינים, למחוק פונקציה מאזינה, להגביל את מספר המאזינים ועוד כמה דברים.

הסברתי קודם לכן ששימוש נבון בפונקציות האזנה יכול לסדר מעט את הקוד של Node.js. איך בדיוק? ככה:


var http = require("http");
var server = http.createServer();
server.listen(3000);

server.on("request", function (request, response) {
    response.setHeader("Set-Cookie", ["type=ninja", "language=javascript"]);
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write("Hello World!");
    response.write(request.httpVersion);
    response.end();
});

console.log("Server running at http://localhost:3000/"); //Printing to the console only

מה שאני עשיתי לא שונה באופן מהותי מהסינטקס שראינו במאמר הקודם:


http = require("http"); //The require

var MyServer = http.createServer(function(request, response) {
    response.setHeader("Set-Cookie", ["type=ninja", "language=javascript"]);
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write("Hello World!");
    response.write(request.httpVersion);
    response.end();
});

MyServer.listen(3000);

console.log("Server running at http://localhost:3000/"); //Printing to the console only

אבל עם האזנה אני יכול ליצור קוד יותר מסודר ולהפריד בין אירוע יצירת ה-server למה שקורה מיד אחרי שהוא נוצר. אפשר לעשות את זה כמעט עם כל מודול. כל מודול משחרר events ובדיקה בקוד שלו או בדוקומנטציה שלו תראה לנו את זה. הדרך הפשוטה ביותר, אגב, היא להשתמש ב-utils על מנת לרשת את events וכך לקבל במתנה את כל המתודות שלו.

מה, רגע? ירושות? אפשר לעשות את זה ב-Node.js Utilities. אבל על זה נדבר במאמר הבא.

⚠️ תזכורת – המדריכים האלו הם רק טעימה, בספר שלי "ללמוד Node.js בעברית" יש הסברים מלאים ומקיפים על השפה המיועדים ללימוד עצמי. עם תרגילים והסברים. הספר יצא לאור בשיתוף הקריה האקדמית אונו ובתמיכת החברות אלמנטור, ו-Iron source ונערך טכנית על ידי בנג'י גרינבאום (מפתח ליבה של Node.js), גיל פינק ומתכנתים מעולים נוספים. 

כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.
כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.

אוהבים את מדריך Node.js? רוצים לדעת עוד?

ספר מקיף על Node.js, בעברית, שנכתב על ידי רן בר-זיק וכולל תרגילים רבים ומידע מקיף - גם על מודולים אסינכרוניים וגם על CLI וסטרימים ומידע רב יותר על Node.js ניתן להורדה ממש פה.
למאמר הקודם בסדרת המדריכים על Node.jsמדריך Node.js: שימוש במודולים בסיסיים
למאמר הבא בסדרת המדריכים על Node.jsמדריך Node.js: שימוש ב-Utilities
לכל המאמרים במדריך
node.js

3 תגובות

  1. אסא הגב נובמבר 18, 2015 בשעה 2:16 pm

    נראה כאילו יש טעות בדוגמא האחרונה. הקוד עם פונק' האזנה והקוד עם הסינטקס הקודם זהים.

    • רן בר-זיק הגב נובמבר 21, 2015 בשעה 10:54 am

      תודה רבה על התיקון! 🙂

  2. Asaf הגב ינואר 27, 2019 בשעה 7:21 am

    בכותרת כתוב מודלים במקום מודולים

השארת תגובה

ביטול

ללמוד ג'אווהסקריפט בעברית

ללמוד לתכנת ג'אווהסקריפט בעברית שגייס יותר משלוש מאות אלף שקל ולמעלה מ-2000 תומכים - בואו ללמוד עכשיו איך לתכנת.

רשימת הנושאים
  • מדריכים
    • ריאקט
    • טייפסקריפט
    • ECMAScript 6
    • ES20XX
    • Node.js
    • Express
    • רספברי פיי
    • Babel
    • docker
    • MongoDB
    • Git
    • לימוד MySQL
    • SASS
    • jQuery
    • CSS3
    • HTML 5
    • SVN
    • LESS
  • פיתוח אינטרנט
    • פתרונות ומאמרים על פיתוח אינטרנט
    • jQuery Scripts
    • jQuery למתקדמים
    • יסודות בתכנות
    • נגישות אינטרנט
  • חדשות אינטרנט
  • מידע כללי על אינטרנט
    • רשת האינטרנט
    • בניית אתרי אינטרנט
  • rss logo

    לכל המאמרים

    לכל המאמרים שפורסמו באינטרנט ישראל משנת 2008 ועד עכשיו.
  • rss logo

    RSS Feed

    משתמשים בקורא RSS? אם כן, עקבו אחרי אינטרנט ישראל באמצעות פיד ה-RSS!
    מה זה RSS?
  • Twitter logo

    עקבו אחרי בטוויטר

    בחשבון הטוויטר שלי אני מפרסם עדכונים מהירים על חדשות בתחום התכנות והיזמות, התרעות על מצבי חירום ורכילות בוערת על תחום הווב.
    מה זה טוויטר?
  • facebook like image

    ערוץ הטלגרם של אינטרנט ישראל

    בערוץ הטלגרם של אינטרנט ישראל אני מפרסם את הפוסטים של באתר וכן עדכונים טכנולוגיים נוספים.
    מה זה טלגרם?
  • github logo

    הפרויקטים שלי בגיטהאב

    הפרויקטים שאני כותב ושוחררו לציבור ברישיון קוד פתוח נמצאים ברובם בגיטהאב.
חיפוש

כל הזכויות שמורות לרן בר-זיק ולאינטרנט ישראל | מדיניות הפרטיות של אתר אינטרנט ישראל | אתר אינטרנט ישראל נגיש לפי תקן WCAG 2.0 AA | הצהרת הנגישות של האתר | אבטחת מידע ודיווח על בעיית אבטחת מידע

גלילה לראש העמוד