
pipe. השיעור מציג כמה מהם ומראה איך כל אחד מתנהג לאורך הזמן.reduce לא מחזיר את החישוב החלקי שהגיע עד אותה נקודה, אלא מדווח שגיאה בלבד.הטקסט המלא של הדקות הראשונות בהרצאה «הסבר על Observables - חלק 2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
עכשיו, מה שמעניין בנוגע ל-Observable ושהמטרה שלו הרי זה לדווח לי רצף של נתונים. אבל הוא מאפשר לי גם לעשות בעצם פעולות וחיתוכים על רצף הנתונים.
אבל הנה הקטע המעניין, רצף הנתונים לא מגיע בבת אחת, תחשבו על זה. הוא מגיע לאורך זמן. אם רצף הנתונים היה מגיע בבת אחת, נניח בבת אחת הייתי רוצה לדווח 100 מספרים.
אוקיי, מה הבעיה להשתמש בפרומיס ולדווח מערך שיש לו מהמספרים, לא הייתי צריך בשביל זה Observable. Observable מדווח כמו שאמרנו לאורך זמן על ידי פונקציית Next, אז איך אני יכול לעשות כל מיני חיתוכים על המידע אם המידע לא מגיע עכשיו אלא הוא מתפרס לאורך זמן?
זאת הנקודה המעניינת וזה ניתן לביצוע. אז בואו נעשה את זה. אז הנה יש לנו את ה-Obserable שכל מה שהוא עושה הוא מדווח לנו עשרה מספרים. אם יש שגיאה הוא כמובן מדווח לנו פה את השגיאה בוא נניח שנשים פה אם אתה מתחלק ב-123 ככה שלא יהיה לנו כל כך שגיאות כי אנחנו רוצים לראות מצב שבו יש לי את המידע בלי שגיאות
בשביל לראות טוב את החיתוכים אז אנחנו יודעים שהאובזורגול הזה מדווח לנו עשרה מספרים כי ביקשנו ממנו פה עשרה מספרים אבל הוא מדווח אותם לאורך זמן לוקח לו 5 שניות עד שהוא מסיים.
מה אנחנו עושים? אז אנחנו עכשיו משתמשים בואו נשלוף מהספרייה rxjs/operators אנחנו בעצם שולפים את האופרטורים שאנחנו רוצים לבצע. נתחיל עם פילטר בואו רגע ניפטר גם מזה, אנחנו לא באמת רוצים, או שנשאיר את זה ונשים את זה בהערה.
נעשה שכפול, הכי טוב, ובגרסה הזאת נוריד, והנה יש לנו subscribe עם עשרה מספרים. אם אנחנו נריץ אך ורק את הקוד הזה, בואו רגע נפתח טרמינל, נריץ אותו, אנחנו בעצם הולכים לקבל תוך חמש שניות עשרה מספרים.
no matter what, ואלה המספרים שדווחו. אבל מה קורה אם אני רוצה לעשות איזשהו filtering לאורך זמן על המספרים, ולהגיד: רגע, אני לא רוצה שתביא לי את המספרים as is, אני רוצה לבצע איזושהי פעולה עליהם.
אז מה שאנחנו עושים בין ה-subscribe לבין ה-observable אנחנו קוראים לפונקציה שנקראת pipe. כלומר, pipe זה צינור, כאילו שיש פה איזשהו ערוץ תקשורת לתוך הנתונים שמוזרמים אלינו.
ואז אנחנו משתמשים באותו אופרטור שאנחנו מחלצים מהספרייה operators. אז אנחנו מתחילים קודם כל עם פילטר. פילטר, כל אחד מהאופרטורים למעשה זאת פונקציה שמקבלת arrow או inline function והיא אומרת, תשמעו, אני לכל נתון אקרא,
כל נתון שה-obserable מדווח לי, לפני שאני אביא אותו לכם, אני קורא לפונקציה שלכם ונותן לכם את הנתון. תגידו לי אם אתם רוצים את זה, כן או לא. אז בואו נגיד שאנחנו רוצים לקבל רק את המספרים הזוגיים.
אז אם מודולו 2 הוא 0, רק אז אני רוצה בעצם לקבל את המספר. אז יש לנו פה איזשהו פילטרינג שמתבצע לאורך זמן. בואו נריץ ונראה שהוא מביא לי, אתם רואים שלפעמים הוא מפסיק טיפה, הוא מביא לי רק את הזוגיים, הוא גם לא הביא לי 10, אחד, שתיים, שלוש, ארבע, חמש, שש, שבע.
מביא לי שבעה מספרים. בואו נריץ שוב פעם ונראה כמה הוא מוביל לי כרגע. אחד, שתיים, שלוש, ארבע, חמש, שש, שבע גם כן.
בסדר, הוא מוביל לי רק את הזוגיים כי זה מה שאמרתי לו. מגניב, איזה עוד אופרטורים יש לנו. בואו נשכפל את כל זה, נשים את זה כאן וניגש אחרי הפילטר ל-map, אופרטור map, וזה ממפה לנו את המספרים למשהו אחר.
מאפ אומרת לנו, תשמעו, הנה כל מספר שהמערכת מדווחת לי, ה-Observable מדווח, ואני, תגידו לי מה אתם רוצים להחזיר ממנו. אתם מחליטים.
בואו ניקח ונחזיר את המספר כפול מינוס אחד, או פשוט נחזיר את השלילי שלו, זה בדיוק אותו דבר. אם עכשיו אנחנו נקבל את הדיווחים, נראה שפתאום כל המספרים הפכו להיות שליליים או בוא נגיד כל מספר כפול 3. map זה מיפוי מה היה לך אני בעצם מחזיר map של המידע מיפוי למשהו אחר.
אולי אתם מכירים פונקציה שנקראת Reduce פונקציה מאוד שימושית בואו נסתכל איך אנחנו יכולים להשתמש עם אופרטור Reduce נחזור לפה. use זה פונקציה מעניינת והיא אומרת לנו תשמעו אני מחזירה לכם מכל הרצף רק מספר אחד אבל אני לא יודעת איזה חישוב אתם רוצים לעשות אתם תגידו לי אז אני נותנת לכם פה
פונקציה כלומר אתם נותנים לי פונקציה בואו רגע ניפטר ממה שהיה בmap שמקבלת שני ערכים ערך ראשון זה האקומוליישן, האקומולייטיב, החישוב המצטבר שיש תוך כדי רצף המספרים, והדבר הבא זה המספר עצמו שאתם מדווחים.
תגידו לי מה אתם רוצים לבצע מבחינת החישוב. נניח שאנחנו רוצים סכום של כל המספרים, אז בואו ניקח את האקומולייטיב הזה ונחבר אותו עם המספר. בפעם הראשונה