PracticU

דוגמה לקוד אסינכרוני ב-NodeJS

בלי כתוביותעם כתוביות
PracticU › קורס NodeJS › דוגמה לקוד אסינכרוני ב-NodeJS
מילון מושגים:
אסינכרוני - אופן פעולה שבו פעולה ארוכה רצה ברקע והתוכנית ממשיכה בלי להמתין לה, ומטופלת כשתסתיים.
Node.js - סביבת ריצה שמאפשרת להריץ קוד JavaScript מחוץ לדפדפן, בעיקר בצד השרת.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.
דיסק - התקן לאחסון קבוע של נתונים, כמו כונן קשיח (HDD) או כונן מבוסס זיכרון מהיר (SSD).
מסד נתונים - אוסף מאורגן של נתונים המאוחסן כך שאפשר לשמור, לחפש, לעדכן ולשלוף אותו ביעילות, לרוב באמצעות שפת שאילתות.

דוגמה לקוד אסינכרוני ב-NodeJS
המרצה מדגים מעבר מקוד סינכרוני לקוד אסינכרוני בתוכנית Node.js, עם מודול שמבצע חישוב כבד.
המודול longcalc.js
נכתבה פונקציה בשם doWork שמבצעת לולאה ארוכה שמחשבת סכום. לפני הלולאה ואחריה מודפסים starting do work ו-ending do work. הפונקציה נחשפת בעזרת module.exports.
הקובץ הראשי
הקובץ הראשי מייבא את המודול עם require('./longcalc'), מדפיס Starting Operation B, קורא ל-doWork, ומדפיס Ending Operation B. כך רואים את הקוד הסינכרוני: כל הפעולה חוסמת את ההמשך.
הפיכה לאסינכרונית
כדי לשחרר את הקוד הראשי, עוטפים את הלולאה ב-setTimeout, עם השהיה של 10 מילישניות:
setTimeout(() => { ... }, 10);
הדפסת הסיום עוברת לתוך הפונקציה שב-setTimeout. כך Operation C מתבצעת מיד, ורק אחר כך מתבצעת הלולאה.
הגבלה של הדוגמה
המרצה הדגיש שהעטיפה הזאת לא פותרת את הבעיה במלואה. הלולאה עצמה עדיין רצה על ה-Call Stack כשהיא מתבצעת, ולכן אם היא ארוכה היא עדיין חוסמת. פעולות כמו גישה לדיסק ולמסד נתונים הן אחרת, כי הן מתבצעות בצד ב-C++ APIs.
בנוסף, בעזרת setTimeout אי אפשר להחזיר תוצאה מהפונקציה בעזרת return. בעיה זו מוצגת בדוגמה הבאה.
הדוגמה מראה את ההבדל בין הרצה סינכרונית להרצה שמעבירה חלק מהעבודה הצידה.
השיעור הבא בקורס: הסבר על Callback

פרקי ההרצאה: דוגמה לקוד אסינכרוני ב-NodeJS

  1. 00:00

    מודול חישוב כבד ואיך הוא נטען

  2. 01:03

    הדמיית קוד שלוקח זמן עם לולאה

  3. 01:47

    ייבוא המודול והפעלת הפונקציה

  4. 03:34

    הרצה סינכרונית ומדידת ההמתנה

  5. 04:11

    הרצת קוד ברקע כדי לא לחסום

  6. 04:49

    הדגמת סדר ביצוע של שלוש פעולות

תמלול ההרצאה: דוגמה לקוד אסינכרוני ב-NodeJS

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

  1. 00:02

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

  2. 00:26

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

  3. 00:46

    אז בואו ניקח איזושהי פונקציה do work והפונקציה הזאת צריכה לבצע משהו שלוקח הרבה זמן. console.log start starting do work ויש לנו כאן ending do work ובוא נניח שכאן יש לנו איזה קטע קוד שלוקח הרבה זמן.

  4. 01:12

    אז איך אנחנו יכולים לבצע הדמיה לקטע קוד שלוקח הרבה זמן? אז כרגע מה שנעשה זה ניצור לולאה i שווה 1, i קטן שווה לאיזשהו מספר מאוד גדול, i פלוס פלוס, ונבצע פה איזשהו חישוב כלשהו, יש לנו פה sum פלוס שווה i. אז זה בעצם יעכב טיפה את המערכת, שאמור לעכב את טיפת המערכת אנחנו רוצים לבוא לכאן

  5. 01:52

    ואנחנו רוצים קודם כל לעשות require לדבר הזה const long calc שווה require ויש לנו בתיקייה הנוכחית את המודול long calc ועכשיו אנחנו רוצים לגשת ולבצע פה את הקוד הבא קונסול לוג סטארטינג אפ ג'י אס יש לנו כאן קונסול לוג אנדינג אפ ג'י אס לונג קאלק נקודה do do התכוונתי לדו וורק

  6. 02:27

    או יש לא חשפתי החוצה את הפונקציה אז יש לנו במודול אקספורטס נקרא לזה דו וורק או שנעשה את מה שאנחנו תמיד עושים וניקח את do work לפה, לא on call, do work בצורה כזאת.

  7. 03:00

    אז מה אנחנו בעצם רוצים לעשות? אנחנו רוצים רגע להריץ את זה, לראות כמה זמן לוקח ללולה להתבצע. Node up. אם אני הולך, אם אני מריץ את זה, כמובן שקודם כל נראה starting up, starting do work, כאן תהיה איזושהי המתנה, אם היא תהיה יחסית מהירה נצטרך להעלות את המספר הזה,

  8. 03:21

    ending do work ו-ending up chase. או שפה נעשה כאן סטארט ו-אנד בכדי שזה יהיה קצת יותר פשוט לראות. יאללה, בואו נריץ את זה. סטארט, סטארט אינדו וורק, אינד אינדו וורק, אנד.

  9. 03:40

    הקוד הזה נקרא קוד סינכרוני, הוא מסונכרן אחד עם השני, הוא עדיין לא קוד אסינכרוני. אני הגדלתי את זה ב-1, ב-0, 1. נריץ, רואים את זה טיפה, בואו נגדיל את זה ל-5.

  10. 03:56

    נריץ שוב פעם. נתן להם לקטע מסך, נריץ, אנחנו רואים שיש פה המתנה והוא מסתיים. בואו נסתכל על זה.

  11. 04:05

    אני מריץ, אני רואה סטארטינג, סטארטינג, ואז אנדינג, אנדינג. כלומר הייתה פה איזושהי המתנה מסוימת, מאוד מהירה, אבל עדיין ראינו אותה והוא היה צריך להמתין. אבל מה קורה עם הקטע קוד הזה, אני לא רוצה בהכרח שהוא ימתין עד שהקטע קוד הזה יסתיים. זאת אומרת, זה נקרא Operation A, זה נקרא Operation B. בואו נגיד שיש לנו פה Starting Operation B,

  12. 04:40

    Ending Operation B, וזה Operation C, אבל אני לא רוצה להמתין עד ש-Operation B יסתיים לפני שאני מראה את Operation C, או לפני שאני מוציא לפועל את Operation C.

  13. 04:55

    זה יהיה CM/CLS, ובואו נריץ את זה. Operation A, Operation B מתחיל, Operation B נגמר, ורק אז Operation C. אנחנו רוצים עכשיו לבצע פה איזשהו תכנות אסינכרונית.

  14. 05:11

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

  15. 05:25

    את זה אנחנו יכולים לעשות במקרה הזה עם ה-Set Timeout.

לקורס המלא: קורס NodeJS אונליין בעברית

ההרצאה הקודמת: סימולטור של תכנות אסינכרוני ב-JS

ההרצאה הבאה: הסבר על Callback

הרצאות קשורות מקורסים אחרים

  • תכנות אסינכרוני ASYNC בשפת Dart
  • התקנה של NodeJS - פרויקט NodeJS

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס ריאקט - React