
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 מתבצעת מיד, ורק אחר כך מתבצעת הלולאה.setTimeout אי אפשר להחזיר תוצאה מהפונקציה בעזרת return. בעיה זו מוצגת בדוגמה הבאה.הטקסט המלא של הדקות הראשונות בהרצאה «דוגמה לקוד אסינכרוני ב-NodeJS» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אז אחרי שראינו את האסינכרוניוס מודל של JavaScript עם הסימולטור המעניין הזה, בואו נראה איך אנחנו מיישמים את מה שלמדנו כאן בקוד ב-Node.js. יש לנו כאן את ה-App.js, בואו רק לצורך הדוגמה נצרף איזה מודול נפרד בכדי שנשים אותו ככה בצד כאן ונוכל לראות את הקודים גם שלוקחים הרבה זמן וגם את הקודים
שאנחנו משתמשים בהם. אז בואו נגיד שאנחנו קוראים לו longcalc.js. כאילו חישובים שלוקחים הרבה זמן. הנה נשים אותו כאן ואנחנו רוצים לבנות בו איזושהי פונקציה.
אז בואו ניקח איזושהי פונקציה do work והפונקציה הזאת צריכה לבצע משהו שלוקח הרבה זמן. console.log start starting do work ויש לנו כאן ending do work ובוא נניח שכאן יש לנו איזה קטע קוד שלוקח הרבה זמן.
אז איך אנחנו יכולים לבצע הדמיה לקטע קוד שלוקח הרבה זמן? אז כרגע מה שנעשה זה ניצור לולאה i שווה 1, i קטן שווה לאיזשהו מספר מאוד גדול, i פלוס פלוס, ונבצע פה איזשהו חישוב כלשהו, יש לנו פה sum פלוס שווה i. אז זה בעצם יעכב טיפה את המערכת, שאמור לעכב את טיפת המערכת אנחנו רוצים לבוא לכאן
ואנחנו רוצים קודם כל לעשות require לדבר הזה const long calc שווה require ויש לנו בתיקייה הנוכחית את המודול long calc ועכשיו אנחנו רוצים לגשת ולבצע פה את הקוד הבא קונסול לוג סטארטינג אפ ג'י אס יש לנו כאן קונסול לוג אנדינג אפ ג'י אס לונג קאלק נקודה do do התכוונתי לדו וורק
או יש לא חשפתי החוצה את הפונקציה אז יש לנו במודול אקספורטס נקרא לזה דו וורק או שנעשה את מה שאנחנו תמיד עושים וניקח את do work לפה, לא on call, do work בצורה כזאת.
אז מה אנחנו בעצם רוצים לעשות? אנחנו רוצים רגע להריץ את זה, לראות כמה זמן לוקח ללולה להתבצע. Node up. אם אני הולך, אם אני מריץ את זה, כמובן שקודם כל נראה starting up, starting do work, כאן תהיה איזושהי המתנה, אם היא תהיה יחסית מהירה נצטרך להעלות את המספר הזה,
ending do work ו-ending up chase. או שפה נעשה כאן סטארט ו-אנד בכדי שזה יהיה קצת יותר פשוט לראות. יאללה, בואו נריץ את זה. סטארט, סטארט אינדו וורק, אינד אינדו וורק, אנד.
הקוד הזה נקרא קוד סינכרוני, הוא מסונכרן אחד עם השני, הוא עדיין לא קוד אסינכרוני. אני הגדלתי את זה ב-1, ב-0, 1. נריץ, רואים את זה טיפה, בואו נגדיל את זה ל-5.
נריץ שוב פעם. נתן להם לקטע מסך, נריץ, אנחנו רואים שיש פה המתנה והוא מסתיים. בואו נסתכל על זה.
אני מריץ, אני רואה סטארטינג, סטארטינג, ואז אנדינג, אנדינג. כלומר הייתה פה איזושהי המתנה מסוימת, מאוד מהירה, אבל עדיין ראינו אותה והוא היה צריך להמתין. אבל מה קורה עם הקטע קוד הזה, אני לא רוצה בהכרח שהוא ימתין עד שהקטע קוד הזה יסתיים. זאת אומרת, זה נקרא Operation A, זה נקרא Operation B. בואו נגיד שיש לנו פה Starting Operation B,
Ending Operation B, וזה Operation C, אבל אני לא רוצה להמתין עד ש-Operation B יסתיים לפני שאני מראה את Operation C, או לפני שאני מוציא לפועל את Operation C.
זה יהיה CM/CLS, ובואו נריץ את זה. Operation A, Operation B מתחיל, Operation B נגמר, ורק אז Operation C. אנחנו רוצים עכשיו לבצע פה איזשהו תכנות אסינכרונית.
זאת אומרת, אנחנו רוצים לקחת את הקטע קוד הזה ולהגיד לו, תראה, תרוץ רגע בצד ב-Web APIs בכדי לפנות לנו מקום, ורק כאשר אתה מסתיים, אז תבוא ותמשיך לבצע את הפעולה.
את זה אנחנו יכולים לעשות במקרה הזה עם ה-Set Timeout.