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

מדריך Node.js: קוד אסינכרוני

רן בר-זיק אוקטובר 7, 2014 7:46 am 8 תגובות

קוד סינכרוני וקוד אסינכרוני עם Node.js. מה זה ומה המשמעות של זה.

כדאי תמיד להשאר מעודכנים! הרשמו לעדכונים של האתר במייל! - המייל יישלח כל יום ראשון בעשר בבוקר ויכיל אך ורק את המאמרים שהתפרסמו באינטרנט ישראל. ללא ספאם, ללא הצפות, ללא בלגנים. אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט. הפרויקט הוא הפרויקט הספרותי המוביל בהדסטארט. בשיתוף הקריה האקדמית אונו.

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

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

במאמר הקודם למדנו על סביבת העבודה של Node.js – איך מתקינים את Node.js על לינוקס או על חלונות. ואיך עובדים על Node.js באמצעות יצירת קובץ js והרצה שלו עם nodejs.

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

על מנת לבצע את רוב הפעולות ב-node.js אנו קוראים למודולים. המודולים יכולים להגיע ב-core או להטען מבחוץ. אחד המודולים היותר חשובים הוא המודול שעוזר ל-node.js להתעסק עם הקבצים ושמו בישראל הוא fs – יעני file system 🙂 איך אנו קוראים למודולים? באמצעות require – אני ארחיב מאוד על מודולים בהמשך. אבל בוא בינתיים נרגע קצת ונסתכל על הקוד המאוד פשוט הזה:


var fs = require('fs');

filenames = fs.readdirSync(".");
for (i = 0; i < filenames.length; i++) {
    console.log(filenames[i]);
}

processId = process.getuid();
console.log(processId);

מה הקוד הזה עושה? לא צריך להיות מהנדס טילים כדי לדעת שמה שהוא עושה זה להדפיס את רשימת הקבצים שיש בתיקיה. בסופו של יום הוא מדפיס את ה-process id. מה הבעיה עם הקוד הזה? אין בעיה בכלל. מה הפלט שלו? על מנת לראות את הפלט שלו אני אשמור אותו כ:test_sync.js ואריץ אותו באמצעות nodejs test_sync.js. מה יצא לי בסוף מזה?


$ nodejs test.js 
test.js
test_sync.js
1000

מה אני מקבל פה? את רשימת הקבצים בתיקיה שלי (במקרה הזה test.js וכמובן test_sync.js) ואז מספר שמציין את ה-ProcessId. לא משהו שצריך להפיל אתכם.

מדובר פה בקוד סינכרוני – זה קוד שכל מי שמתכנת JS יותר מיום אמור להכיר. הבעיה היא (או יותר נכון היתרון האדיר של Node.js) שאנו אמורים לכתוב את הקוד כקוד א-סינכרוני. האמת היא שמודול fs הוא אחד המודולים הבודדים שמאפשרים לכתוב קוד סינכרוני. למה אנחנו אמורים לכתוב קוד אסינכרוני? כי קוד סינכרוני תוקע לנו את המערכת. אם נסתכל על הקוד שלעיל, אנו נראה שיש שם בת'כלס שתי פעולות – הדפסת הקבצים, שמותנית בקריאה של התיקיה שבה אנו נמצאים והדפסת ה-processId. כאשר אנו כותבים קוד סינכרוני אנחנו בעצם תוקעים את המערכת ולא מאפשרים לשאר הפעולות להעשות. התקיעה היא לא בהדפסה של שמות הקבצים אלא בהמתנה הארוכה ל-fs כדי שיקרא את רשימת הקבצים.

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

איך עושים את זה? באמצעות callbacks. זה סינטקס שאמור להיות מוכר מאוד לכל מי שהתעסק ב-jQuery בכלל וב-AJAX בפרט. מה שאנחנו עושים זה לקרוא ל-fs ואז לומר – 'מר בחור, עד שתסיים עם הקריאה מה-fs ותשיג לי את כל המידע – תמשיך את הסקריפט ואל תחכה'. איך עושים את זה?


var fs = require('fs');

fs.readdir(".", function (err, filenames) {
    var i;
    for (i = 0; i < filenames.length; i++) {
        console.log(filenames[i]);
    }
});

processId = process.getuid();
console.log(processId);

הדבר הכי חשוב פה הוא להסתכל איך הפעולה של ה-fs.readdir בנויה. אני מעביר לה שני ארגומנטים – הראשון הוא הפרמטר שהיא צריכה (באיזה נתיב לחפש) – בדיוק כמו הקוד הסינכרוני. השני הוא פונקציה אנונימית חביבה שמקבלת שני ארגומנטים גם היא: err (לתקלות) ו-filenames) שזו התוצאה. הפונקציה האנונימית מכילה את ההדפסה של שמות הקבצים. את ההדפסה של ProcessId אני מבצע כרגיל.

איך הפלט יראה לפי דעתכם? אותו הדבר?
בוודאי שלא! הוא יראה ככה:


$ nodejs test.js 
1000
test.js
test_sync.js

מה השינוי לעומת הפלט של הקוד הסינכרוני? שההדפסה של ה-ProcessId מתבצעת קודם! למה? איך זה יכול להיות? הרי ההדפסה הארורה מופיעה במורד הקוד! ההסבר הוא שכפי שהסברתי קודם לכן – מדובר בקוד א-סינכרוני. ה-callback של fs מופעל רק כשה-fs מסיימת לקרוא את מערכת הקבצים – עד אז הקוד ממשיך כרגיל ואין לנו תקיעות של המערכת.

אם זה נראה לכם מסובך או לא מובן מספיק, הייתי מציע לכם לבדוק את jQuery ו-AJAX – שם בדיוק זה אותו הדבר. אנו מבצעים פעולה (GET באמצעות AJAX לצורך העניין) ומבצעים callback רק כשהתוצאה מגיעה מהשרת, לא לפני. הסינטקס הוא אותו סינטקס.

המהפך מחשיבה של קוד סינכרוני לקוד אסינכרוני היא לא פשוטה, אנחנו נמשיך לדבר על קוד אסינכרוני בהמשך. מדובר באחד הדברים החשובים ביותר ב-Node.js.

כמה הערות חשובות לפני שממשיכים:

קולבקים הם לא הדרך היחידה לכתוב קוד א-סינכרוני בג'אווהסקריפט. יש לנו פרומיסים ויש לנו async await. בסדרת המדריכים הזו אני משתמש בקולבקים בלבד. אבל בספרים שלי "ללמוד ג'אווהסקריפט בעברית" וספר ההמשך "ללמוד Node.js בעברית" אני מלמד על שתי השיטות שלעיל. אם הספרים האלו מעניינים אתכם ואתם רוצים ללמוד ברצינות – נסו אותם.

 

 

כדאי תמיד להשאר מעודכנים! הרשמו לעדכונים של האתר במייל! - המייל יישלח כל יום ראשון בעשר בבוקר ויכיל אך ורק את המאמרים שהתפרסמו באינטרנט ישראל. ללא ספאם, ללא הצפות, ללא בלגנים. אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט. הפרויקט הוא הפרויקט הספרותי המוביל בהדסטארט. בשיתוף הקריה האקדמית אונו.
כדאי תמיד להשאר מעודכנים! הרשמו לעדכונים של האתר במייל! - המייל יישלח כל יום ראשון בעשר בבוקר ויכיל אך ורק את המאמרים שהתפרסמו באינטרנט ישראל. ללא ספאם, ללא הצפות, ללא בלגנים. אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט. הפרויקט הוא הפרויקט הספרותי המוביל בהדסטארט. בשיתוף הקריה האקדמית אונו.

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

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

8 תגובות

  1. Assaf הגב אוגוסט 7, 2016 בשעה 12:46 pm

    ג'ים משך אותי ממש להתחלה…:)
    בהרצה האה סינכרונית אני מקבל את השגיאה הבאה:
    process.getuid is not a function
    ממה יכול להיות שנובע?

    • רן בר-זיק הגב אוגוסט 12, 2016 בשעה 8:18 am

      זה בגללי, או יותר נכון – זה בגלל מערכת ההפעלה חלונות שלא אוהבת את processId = process.getuid();
      אני אתקן את הדוגמה, אבל אפשר להשתמש ב:
      process.hrtime(); במקום. זה אמור לעבוד גם על חלונות.

      • Yaniv הגב ספטמבר 21, 2016 בשעה 5:39 pm

        http://stackoverflow.com/questions/10356814/process-getuid-not-working-on-windows

  2. אבי הגב אוגוסט 8, 2016 בשעה 2:43 pm

    הבנתי את העקרון של הפוסט,הכתיבה שלך בהירה ומובנת!
    אך משום מה זה אני מריץ את הקובץ והוא נותן לי הודעות שגיאה.
    ניסיתי להעלות צילום מסך אבל אי אפשר..
    אז אשמח אם תוכל לתת לי את המייל שלך כדי שאשלח אליך הודעה, אם זה בסדר מבחינתך..
    בעקרון הוא כותב לי כל מיני דברים, אבל נראה לי שהעיקרי שבהם הוא getid is not a function

    • רן בר-זיק הגב אוגוסט 12, 2016 בשעה 8:18 am

      זה בגללי, או יותר נכון – זה בגלל מערכת ההפעלה חלונות שלא אוהבת את processId = process.getuid();
      אני אתקן את הדוגמה, אבל אפשר להשתמש ב:
      process.hrtime(); במקום. זה אמור לעבוד גם על חלונות.

  3. זושא הגב דצמבר 13, 2016 בשעה 2:00 pm

    מקצועי וקליל, תודה

    • רן בר-זיק הגב דצמבר 14, 2016 בשעה 6:55 am

      תודה רבה! 🙂 בסופו של דבר זה לא מדע טילים… 😉

  4. לוטן הגב דצמבר 4, 2018 בשעה 4:36 pm

    אני בדיוק לומד ממדריך בUDEMY, ומה שהייתי צריף את הסגירת פינה שלך בנושא (בעיקר בעברית שפת האם).
    תודה רבה!

השארת תגובה

ביטול

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

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

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