
setTimeout מתזמן פעולה שתתבצע בעוד זמן מסוים, והתוכנית ממשיכה בינתיים.הטקסט המלא של הדקות הראשונות בהרצאה «הסבר על תכנות אסינכרוני» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים לפרק חדש שנקרא Asynchronous Programming, תכנות אסינכרוני. הדבר הזה הוא מאוד נפוץ בג'אווה סקריפט, כשפת ג'אווה סקריפט, גם כשאנחנו עובדים בדפדפן, ומאוד נפוץ, או לא פחות נפוץ, בנוד ג'י אס.
אנחנו הולכים להבין בפרק הזה קודם כל למה הדבר הזה הוא כל כך קריטי וכל כך חשוב, ואיך אנחנו מיישמים את זה כמובן בנוד ג'י אס בכמה טכניקות. אז בואו נניח שאנחנו כרגע מריצים JavaScript בקליינט סייד דפדפן.
כבר נעבור ל-Node.js, אבל בואו נניח שהקובץ הזה הוא JavaScript דפדפן, ואנחנו רוצים להריץ שלושה קטעי קוד שונים. יש לנו פה Console.log, ואנחנו פה מבצעים Operation A. יש לנו Console.log, ואנחנו מבצעים Operation B, ולבסוף Operation C. עכשיו, הקוד הזה שאני כתבתי Operation A, B ו-C זה רק כמובן דמו לקטע קוד אמיתי.
אז אם אנחנו עכשיו הולכים להריץ את זה בג'אווה סקריפט דפדפן, נתחיל עם ג'אווה סקריפט דפדפן, אז כמובן, אני כרגע אריץ את זה כמובן עם Node App, אנחנו נראה מיידית Operation A, B ו-C.
הכל עובד כמו שצריך, וגם לא הייתה פה שום בעיה. מה הבעיה? הנה הצגנו את A, הנה את B, הנה את C. אבל בוא נניח שאופריישן B לוקח 10 שניות לביצוע. בוא נניח שאופריישן B זה איזשהו קטע קוד שמבצע עיבוד תמונה או עיבוד וידאו.
בקליינט סייד, בג'אווה סקריפט אוף דה פאן. אבל אין מה לעשות, עיבוד תמונה או עיבוד וידאו זה משהו שלוקח הרבה זמן, ובוא נניח שזה לוקח 10 שניות.
מה יקרה אז? אז אופריישן A מיד יתבצע, אופריישן B ייקח לו 10 שניות להתבצע, אבל השאלה, מה קורה ל-Operation C? אז JavaScript כשפת JavaScript נחשבת שפה של Single Threaded.
Thread זה בעצם ההליך שמריץ לי את האפליקציה, ההליך שמריץ לי את הקוד עצמו. Single Threaded ואומר שיש לנו ב-JavaScript אך ורק Thread אחד ויחיד שמסוגל להריץ את הקוד שאנחנו כותבים.
עכשיו, מה זה מעניין אותי שיש לי רק טרד אחד? כי כל טרד מסוגל להריץ קטע קוד במקביל לטרדים אחרים במחשב.
נניח, בואו ניקח את הצורה הכי מקבילית שיכולה להיות, נניח שהמחשב יש לו ארבעה מעבדים, אז אם אנחנו לוקחים נניח ארבעה טרדים, כל אחד יכול בצורה תיאורטית להשתמש במעבד אחר, וכך באמת הקודים שלנו ירוצו במקביל. גם אם יש לנו מעבד אחד, עדיין אם יש לנו כמה טרדים אז המחשב עושה
את זה בכל כך מהירות גבוהה שזה באמת תהיה מבחינתנו פעולות בצורה מקבילות, בצורה מקבילה, פעולות מקבילות, מפני שטרד מבחינתנו מריץ קטע קוד במקביל.
כל מיני שפות בעולם יש להם אפשרות להריץ מספר טרדים, לדוגמה Java, שפת Java יש לה טרדים, אנחנו יכולים לפתוח טרד ולהריץ פעולות במקביל לשאר האפליקציה.
לדוגמה, C-Sharp, אנחנו יכולים לפתוח טרד ולהריץ פעולות במקביל לשאר האפליקציה שאנחנו בונים.
ב-JavaScript אנחנו לא יכולים לעשות את זה, JavaScript Native, אנחנו לא יכולים לעשות את זה. באיזושהי גרסה מתקדמת יותר של JavaScript, בדפדפן הוסיפו משהו שמאפשר לפתוח טרד נוסף, אבל כאשר אנחנו עובדים ב-JavaScript בצורה רגילה, אין לנו אפשרות לעשות את זה, JavaScript נחשבת Single-threaded אז כל התהליך
שמריץ את לנו את האפליקציה זה התהליך האחד והיחיד שאנחנו רואים כאן. תריץ לי בבקשה את Operation A לאחר מכן תריץ לי את Operation B שלוקח 10 שניות כמו שאמרנו ולבסוף תריץ לי את Operation C.
מה יקרה? Operation C צריך להמתין עד ש-Operation B יסיים. ומה אם Operation C לא קשור ל-Operation B? אנחנו רוצים לא להמתין עד לסיום Operation B אלא לבצע את Operation B ואז או במקביל או בלי צורך להמתין לבצע גם את Operation C.
אז אם ה-Operation B זה בעצם עיבוד תמונה או עיבוד וידאו או לא משנה איזה קטע קוד שפשוט לוקח הרבה זמן אין לנו שום ברירה ובג'אווה סקריפט נייטיב אנחנו נצטרך לראות את Operation A אנחנו נראה את Operation A אנחנו נמתין את ה-10 שניות עד ש-Operation B יסיים ואז אנחנו נראה את Operation C.
אוקיי, בסדר, בשפות אחרות היינו יכולים להוציא את זה לטרדים נפרדים, סבבה, אבל מה קורה אם Operation B לוקח 0 שניות אבל אנחנו לא חייבים לעצור את כל קטע הקוד הזה בשביל להמתין ל-10 שניות האלה?
זה קורה כאשר הקוד המאסיבי של Operation B