הבנת JavaScript סינכרוני ו - Asynchronous - חלק 1
סינכרוני ו אסינכרוני הם מושגים מבלבלים ב- JavaScript, במיוחד למתחילים. שני דברים או יותר סינכרוני כשהם קורים באותו זמן (מסונכרן), ו אסינכרוני כאשר הם לא (לא מסונכרן).
למרות ההגדרות האלה קל לקחת, זה בעצם יותר מסובך ממה שזה נראה. אנחנו צריכים לקחת בחשבון מה בדיוק הם מסונכרנים, ו מה לא.
אתה בטח תתקשר רגיל
פונקציה ב- JavaScript סינכרוני, נכון? ואם זה משהו כמו setTimeout ()
או AJAX שאתה עובד איתו, תתייחס אליו כאל אסינכרוני, כן? מה אם אני אגיד לך את זה שניהם הם אסינכרוני במובן מסוים?
כדי להסביר את למה, אנחנו צריכים לפנות למר X לעזרה.
תרחיש 1 - מר X מנסה סינכרוניות
הנה ההגדרה:
- מר X הוא מישהו שיכול לענות על שאלות קשות, ולבצע כל משימה מבוקשת.
- הדרך היחידה ליצור איתו קשר היא באמצעות שיחת טלפון.
- לא משנה מה השאלה או המשימה שקיבלת, כדי לבקש את עזרתו של מר איקס לבצע אותה; אתה מתקשר אליו.
- מר X נותן לך את התשובה או משלים את המשימה מיד, ומאפשר לך לדעת זה נעשה.
- אתה מניח את השפופרת מרגיש תוכן ויוצא לסרט.
מה שביצעת זה עתה היה תקשורת סינכרונית (קדימה ואחורה) עם מר איקס. הוא הקשיב כששאלת את שאלתך, והאזנת כשענה לה.
תרחיש 2 - מר X אינו מרוצה מהסינכרוניות
מאז מר X הוא כל כך יעיל, הוא מתחיל לקבל שיחות רבות יותר. אז מה קורה כאשר אתה קורא לו אבל הוא כבר עסוק מדבר עם מישהו אחר? אתה לא תוכל לשאול אותו את השאלה שלך - לא עד שהוא חופשי לקבל את השיחה שלך. כל מה שתשמעו הוא צליל עסוק.
אז מה מר X יכול לעשות כדי להילחם בזה?
במקום לבצע שיחות ישירות:
- מר איקס שכור בחור חדש, מר מ'ונותן לו משיבון למתקשרים להשאיר הודעות.
- התפקיד של מר מ 'הוא להעביר הודעה מהמשיבון למר X ברגע שהוא יודע שמר איקס סיים לחלוטין את העיבוד של כל ההודעות הקודמות וכבר חופשי לקחת אחד חדש.
- אז עכשיו כשאתה קורא לו, במקום לקבל צליל עסוק, אתה מקבל להשאיר הודעה עבור מר X, אם כך לחכות שהוא יתקשר אליך בחזרה (ללא סרט עדיין).
- ברגע שמר X יעשה עם כל ההודעות שעמדו לפניו, הוא יבדוק את הנושא שלך להתקשר אליך בחזרה לתת לך תשובה.
עכשיו כאן טמונה השאלה: היו פעולות עד כה סינכרוני או אסינכרוני?
זה מעורב. כאשר עזבת את ההודעה, מר איקס לא הקשיב לו, כך שהתקשורת הרביעית היתה לא סינכרונית.
אבל, כאשר השיב, היית שם מקשיב, איזה עושה את התקשורת לחזור סינכרוני.
אני מקווה שעכשיו רכשת הבנה טובה יותר של האופן שבו נתפסת הסינכרוניזציה במונחים של תקשורת. הגיע הזמן להביא JavaScript.
JavaScript - שפת תכנות אסינכרוני
כאשר מישהו תוויות JavaScript אסינכרוני, מה הם מתייחסים באופן כללי היא איך אתה יכול השאר הודעה עבורו, ו לא חסרה השיחה שלך עם צליל עסוק.
קריאות הפונקציה הן אף פעם לא ישיר ב- JavaScript, הם עושים את זה ממש באמצעות הודעות.
JavaScript משתמש תור הודעות שבו הודעות נכנסות (או אירועים) מוחזקים. An לולאת האירוע (משגר הודעה) ברצף שולח הודעות אלה ל ערימת שיחה שבו הפונקציות המתאימות של ההודעות הן מוערמים כמו מסגרות (פונקציות ומשתנים פונקציה) לביצוע.
ערימת השיחה מחזיקה את המסגרת של הפונקציה הראשונית נקראת, וכל מסגרות אחרות עבור פונקציות קרא באמצעות שיחות מקוננות על גבי זה .
כאשר הודעה מצטרפת לתור, היא ממתינה עד להשלמת ערימת השיחה ריק מכל המסגרות מהודעה הקודמת, ומתי זה, לולאה האירוע מסיר את ההודעה הקודמת, ומוסיף את המסגרות המתאימות של ההודעה הנוכחית לערימת השיחה.
ההודעה ממתינה שוב עד להופעת ערימת השיחה ריק ממסגרות המתאימות לו (כלומר ההוצאות להורג של כל הפונקציות מוערמות מעל), ואז הוא dqueued.
שקול את הקוד הבא:
function foo () סרגל הפונקציות () foo (); function baz () bar (); baz ();
הפונקציה להיות מופעל baz ()
(בשורה האחרונה של קטע הקוד), עבורו תוסיף הודעה לתור, וכאשר לולאת האירוע בוחרת אותו, ערימת השיחה מתחיל לערום מסגרות ל baz ()
, בר ()
, ו foo ()
בנקודות הביצוע הרלוונטיות.
לאחר ביצוע הפונקציות הוא אחד אחד, מסגרות שלהם הוסר מערימת השיחה, כאשר ההודעה היא עדיין ממתין בתור, עד baz ()
הוא צץ מן הערימה.
זכור, קריאות הפונקציה הן אף פעם לא ישיר ב- JavaScript, הם סיימו באמצעות הודעות. אז בכל פעם שאתה שומע מישהו אומר כי JavaScript עצמה היא שפת תכנות אסינכרוני, להניח כי הם מדברים על מובנית שלה “משיבון”, ואיך אתה חופשי להשאיר הודעות.
אבל מה לגבי שיטות ספציפיות אסינכרוני?
עד כה לא נגעתי ב- APIs כגון setTimeout ()
ו AJAX, אלה הם אלה שהם המכונה במיוחד אסינכרוני. למה?
חשוב להבין מה בדיוק הוא סינכרוני או אסינכרוני. JavaScript, בעזרת האירועים ואת לולאה האירוע, יכול לתרגל עיבוד אסינכרוני של הודעות, אבל זה לא אומר הכל ב- JavaScript הוא אסינכרוני.
זכור, אמרתי לך את ההודעה לא לעזוב עד ערימת השיחה היה ריק ממסגרות המתאימות, בדיוק כמו שלא יצאת לסרט עד שתקבל את התשובה שלך - זה להיות סינכרוני, אתה שם מחכה עד שהמשימה תושלם, ואתה מקבל את התשובה.
ממתין הוא לא אידיאלי בכל התרחישים. מה אם לאחר השארת הודעה, במקום לחכות, אתה יכול לעזוב את הסרט? מה אם פונקציה יכולה לפרוש (ריקון מחסנית השיחה), ואת ההודעה שלה יכול להיות dequeued עוד לפני המשימה של הפונקציה הושלמה? מה אם אתה יכול לקבל קוד מבוצע באופן אסינכרוני?
זה המקום שבו APIs כגון setTimeout ()
ו AJAX נכנסים לתמונה, ומה שהם עושים הוא ... להחזיק מעמד, אני לא יכול להסביר את זה בלי לחזור למר X, אשר נראה בחלק השני של מאמר זה. המשך לעקוב.