
הטקסט המלא של הדקות הראשונות בהרצאה «תכנות אסינכרוני ASYNC בשפת Dart» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בשיעור הזה נלמד על קוד הסינכרוני שזה אומר futures, then, async ו-awet. אז מה זה בעצם קוד הסינכרוני?
קוד הסינכרוני זה קוד שרץ לפי הסדר שבו הוא נכתב. אם לדוגמה נרשום את סדר הפקודות פרינט 1, פרינט 2 ופרינט 3, נריץ את הקוד, נראה ריצה לפי אותו סדר בדיוק.
אבל מה קורה אם בין 1 ל-2 אני רוצה להדפיס לדוגמה את מזג האוויר של עכשיו. העניין הוא שאין לי את מזג האוויר בדיוק באותו רגע, אלא הוא יגיע אליי אחרי 2-3 שניות, אני צריך לבצע איזושהי פנייה לאיזשהו שרת וזה לוקח בין 2 ל-3 שניות.
אני אדביק כאן פונקציה שבעצם מדמה לי בקשה של מזג האוויר משרת. כל מה שהיא עושה היא רק ממתינה 3 שניות ולאחר מכן מחזירה לי ערך קבוע של 32.3. לצורך העניין זה בדיוק כמו לבקש את מזג האוויר משרת.
ועכשיו אני ארשום print get weather. עכשיו לפני שאני אריץ את הקוד הזה אני רוצה לדבר קצת על future. מה זה future? כל דבר שאמור לקרות בעתיד נקרא future זאת אומרת אם יש לי פונקציה שמחזירה לי מיד מספר אז אפשר להגיד שהפונקציה מחזירה לי int אם היא מחזירה מיד true או false היא מחזירה לי בוליאן אבל מה קורה כמו בפונקציה הזאת שהיא לא מחזירה לי ערך מיד אלא היא מחזירה
לי ערך בעוד שלוש שניות או בעוד x שניות אז אפשר לומר שהערך המוחזר מהפונקציה נקרא future עכשיו אני אריץ את הקוד אוקיי ואנחנו רואים פה אחד ואז instance of future double מה זה אומר?
זאת אומרת שהפונקציה בעצם מחזירה לי מופע של future ולא את הערך 32.3 כמו שציפינו. למה? כי בזמן שהקוד רץ הערך עדיין לא קיים, הוא יהיה קיים רק בעוד 3 שניות. אז מה שאנחנו כן רואים זה את מה שחזר מהפונקציה שזה באמת future.
עכשיו אמרנו שבדרך כלל לא חובה לרשום את סוג המשתנה שהפונקציה מחזירה אבל נוכל לרשום כאן שהפונקציה מחזירה future מסוג double וככה זה טיפה יותר מובן. אז יש לנו פונקציה שנקראת getWeather והיא מחזירה ל-future, זאת אומרת ערך עתידי מסוג double בעוד במקרה הזה שלוש שניות.
אז איך בכל זאת נוכל לקבל את הערך שמוחזר על ידי ה-future שמוחזר על ידי הפונקציה? נוכל להשתמש במילה השמורה then. מה זאת אומרת? נרשום getWeather ואז את המילה השמורה then.
וכבר אפשר לראות שהפונקציה then מקבלת פונקציה שמקבלת כפרמטר משתנה מסוג double. נבנה כאן פונקציה עם פרמטר מסוג דאבל שנקרא לו val לצורך העניין כמובן שאפשר להשמיט את סוג המשתנה דאבל והנה גוף הפונקציה וברגע הזה המשתנה val מכיל את הערך שמוחזר על ידי הפיוג'ר בואו נדפיס אותו print val123 ובעוד 3 שניות הנה 32.3. שימו לב מה קרה פה בעצם print1 print2 וprint3 רצו בצורה סינכרונית
זאת אומרת לפי סדר הכתיבה ו-getWeather החזיר ערך בצורה א-סינכרונית, זאת אומרת לאחר שלוש שניות במקרה הזה.
כמובן שנוכל להמיר את הפונקציה האנונימית שכתבנו כאן בפונקציית חץ, בואו נעשה את זה. getWeather.den נבנה כאן פונקציה שמקבלת פרמטר בשם val והנה החץ ונרשום print val, נריץ שוב.
אז הנה 1, 2 ו-3 ו-32.3 ככה זה קצת יותר מובן וכבי. אבל מה אם בכל זאת נרצה להריץ את הקוד שלנו בצורה סינכרונית ולקפוט על המעבד להמתין עד לסיום ביצוע הפעולה הארוכה ורק אחרי זה להמשיך עם הקוד בדיוק לפי הסדר שבו הוא נכתב.
בדיוק בשביל זה נכנסה המילה a-wait. המילה a-wait בעצם אומרת לקומפיילר תמתין בבקשה עד לסיום ביצוע הפעולה הארוכה ורק אחרי זה תמשיך עם הקוד כמו שהוא נכתב.
חשוב להדגיש שאפשר להשתמש במילה a-wait רק בפונקציה הסינכרונית, זאת אומרת פונקציה שהמילה async נכתבה לפני ההתחלה של המימוש. במקרה הזה כבר הקדמתי ורשמתי async אבל בוא נראה מה קורה אם אני אמחק את המילה הזאת, יש לנו כאן שגיאה the a-weight expression can only be used in an asynchronous function זאת אומרת המילה a-weight ניתנת לשימוש רק בפונקציות אסינכרוניות אז נהפוך
אותה לפונקציה אסינכרונית על ידי הוספה של המילה async ועכשיו נוכל להשתמש במילה a-weight אז נרשום var w מלשון weather שווה ל-a-weight get weather ואז אז הקוד ירוץ, ידפיס 1, לאחר מכן הוא יכניס את ה-GetWeather לתוך משתנה w,
ונוכל עכשיו להדפיס את w. רק לאחר מכן הקוד ירוץ וידפיס את print2 ו-print3. בואו נראה 1 ומייד 32.3 ואז 2 ו-3 בדיוק כמו שציפינו.
כדי לחזק את ההבנה אני רוצה לבנות תרגיל נוסף שיכיל חלק גדול מכל מה שכבר למדנו. נמחק את כל זה. ועכשיו בואו נניח שיש לנו מחלקה שנקראת User.
כל משתמש מכיל שם משתמש, סיסמה ומספר נקודות לדוגמה. בנוסף נחזיק רשימה של יוזרים אצלנו במערכת ואז נבנה פונקציית לוגין שמקבלת שמש שם אפס לסיסמה, ואם קיים יוזר מתאים עם אותו שמש שם אפס לסיסמה היא תחזיר אותו, אם לא היא תחזיר נער.
אז נתחיל מההגדרה של המחלקה class user יש לנו כאן string username, string password ו-int points. נתחיל את זה עם 0 כי לכל יוזר בהתחלה יש 0 נקודות.
עכשיו נבנה קונסטרקטור, קונסטרקטור זה יקבל Username, Password ו-Points ויבצע את חו"ל this.username שווה Username, this.password שווה Password ו-this.points שווה points.
עכשיו אני רוצה לשתף אתכם בדרך מאוד מאוד קלה והרבה יותר מהירה לבנות קונסטרקטורים. יש בדאטה את האפשרות לכתוב לפני השם של הפרמטר this.
ואז הקונסטרקטור כבר ידע איזה משתנה להתחיל. ברגע שרשמתי בקונסטרקטור this.user name הוא כבר ידע לבצע את הפעולה הברורה this.user name = user name ואז אפשר למחוק את השורה הזאת.
כנ"ל לגבי פסוורד ופוינטס this.password ו-this.points ואז תראו איזה קונסטרקטור קצר יש לנו. אוקיי, אז סיימנו עם העניין של המחלקה. עכשיו בואו נגדיר רשימה של יוזרים שהיא תהיה כרגע קבועה.
כמובן שבעולם אמיתי הרשימה תימצא בשרת מרוחק בתוך דאטאבייס אבל רק לצורך המחשה נחזיק אותה כאן. אז נבנה ליפט של יוזר נקרא לה users והיא תהיה שווה לרשימה ריקה ועכשיו נתחיל לדחוף לכאן יוזרים.
אז יוזר אחד שם המשתמש יהיה אלי הסיסמה תהיה 1111 ויש לו 20 נקודות. ניצור עוד שתי יוזרים נוספים השני יהיה אבי סיסמה 2222 עם 40 נקודות ו-john333 עם 44 נקודות.
מעולה. אז יש לנו רשימה של יוזרים, יש לנו מחלקה אה שכחתי כאן פסיק יש לנו רשימה של יוזרים, יש לנו את המחלקה user ועכשיו נשאר לנו לבנות את הפונקציה לוגין שמוצאת את היוזר מתוך רשימת היוזרים אז לוגין תהיה פונקציה שמקבלת
יוזרניים ופסוורד, הפונקציה הזאת תחזיר פיוצ'ר של יוזר, זאת אומרת שלאחר x זמן אחרי שהיא תסיים את פעולת החיפוש היא תחזיר לנו יוזר.
עכשיו אני אדמה למעשה את המציאות בעולם האמיתי כאילו שפנינו לשרת מרוחק, זה לקח בערך 3 שניות ואז קיבלנו חזרה את היוזר או נ"ל אם הוא לא נמצא.
אז future.delayed נמתין משך של 3 שניות ולאחר מכן נבצע את הקוד הזה. אז הדבר הראשון שאנחנו צריכים לעשות בתום שלוש שניות זה לחפש ברשימת היוזרים אם קיים יוזר שהיוזרניים והפספורט שלו זהים לאלה שקיבלנו בפונקציה לוגין.
אז users.firstware בוא נראה מה רשום על