
rxjs לא מגיעה עם Node.js, ולכן מתקינים אותה.create של הקלאס Observable, ומעבירים לו פונקציה שמקבלת אובייקט מתבונן (observer).next שולח ערך, error מדווח שגיאה, ו-complete מסמן שהרצף הסתיים.subscribe. הפונקציה שמועברת ל-subscribe מקבלת את הערכים.הטקסט המלא של הדקות הראשונות בהרצאה «הסבר על Observables - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
כאשר רצינו לבנות פונקציה אסינכרונית שמחזירה לנו איזשהו נתון, אז אנחנו השתמשנו לצורך כך בפרומיס, זה בעצם היה השיטה הנכונה לבצע את זה.
הפונקציה מחזירה פרומיס, הפרומיס ברגע שהוא מסתיים מדווח לנו הצלחה או כישלון. אבל מה קורה אם אנחנו רוצים פונקציה שמדווחת לנו סדרה של נתונים, אבל לא בבת אחת על ידי איזשהו מערך, וזאת הנקודה החשובה, לאורך זמן.
לדוגמה, אנחנו רוצים לקבל רצף של מניות לאורך זמן. כלומר, מעכשיו בשעה הקרובה כל שינוי שיש במניה תדווח לי את השינוי.
או לדוגמה, שערי מטבעות, נניח בחצי שעה הקרובה בוא תדווח לי כל דקה כמה בעצם ערך מטבע מסוים. או רצף נתונים של משחקים, יש עוד המון דוגמאות שבהן אנחנו רוצים בעצם פונקציה שלא מדווחת פעם אחת מידע אלא מדווחת שוב ושוב ושוב לאורך זמן.
לצורך כך אנחנו לא משתמשים בפרומיס מפני שפרומיס ברגע שהוא מבצע ריזולב הוא מסתיים הוא לא יכול לדווח כמה פעמים ריזולב. בריזולב הראשון שאתם מבצעים פרומיס אבוד מת לא יכול יותר לדווח ריזולב אפילו שתנסו בעצמכם כמה פעמים לבצע ריזולב ריזולב ריזולב להמון נתונים לאורך זמן.
גם אם הפרומס מדווח ריג'קט, כמובן שהוא מסתיים. אנחנו לצורך כך משתמשים במשהו שנקרא Observable. Observable זה בעצם המנגנון שקיים היום בעולם מבחינת דיווחים לאורך זמן.
המנגנון הפופולרי שמשתמשים איתו בהמון מקומות. דבר ראשון אנחנו צריכים להתקין ספרייה, Observable הזה כרגע לא בא בילד אין עם Node.js, בואו נבצע התקנה והספרייה נקראת rx.js.
בואו נתקין את זה ואנחנו יכולים עכשיו להשתמש ב-Obserable. לצורך כך בואו נבנה לנו איזשהו מודול נפרד כי הולך להיות לנו פה קצת קוד ובואו נניח שאנחנו רוצים במודול הזה לדווח כרגע הכי פשוט בעולם מספרים.
אז ניקח איזשהו מודול נקרא לו random numbers מספרים רנדומליים בואו נבנה פה איזושהי פונקציה random numbers ונניח אפילו ניקח כאן count כמה בעצם היוזר רוצה כמה סליחה המשתמש לא המשתמש המתכנת שמשתמש בפונקציה רוצה שנדווח לו מספרים רנדומליים אבל לאורך זמן אנחנו לא מדווחים לו אותם בבת אחת עם איזשהו מערך
אלא כל פרק זמן מסוים נותנים לו מספר אחד. אז דבר ראשון, אנחנו רוצים להתחיל לדווח את המספרים. אז לצורך כך אנחנו נצטרך לפתוח set interval, וב-set interval בכל שנייה נניח נדווח איזשהו מספר.
אבל אנחנו צריכים לפני זה to return את ה-observable. שנייה אחת, נגדיר כאן למעלה את ריק ווייר, סליחה, Observable שווה ריק ווייר למעשה rxjs זאת הספרייה בתוכה יש לנו Observable.
אנחנו יכולים לעשות את זה בצורה כזאת או שאנחנו יכולים לבצע את זה בצורה קצת אחרת. אם אנחנו שמים פה מסולסלים, אז הוא מוציא לנו את זה לפה אז אפשר להוציא את זה ואז הוא יחפש את ה-Observable ויביא אותו לכאן זה עוד טכניקה שאפשר להשתמש בה בואו נשים פה ריטרן ונבנה לנו Observable.
Observable אנחנו לא בונים על ידי New אנחנו בונים על ידי Observable.create זה סליחה או גדולה כי זה קלאס Observable.create יוצר לנו Observable.
עכשיו בתוך ה-Observable אנחנו נותנים לו פונקציה בדיוק כמו שנתנו בפרומיס אבל הפונקציה לא מקבלת ריזולב וריג'קט מפני שריזולב הוא אחד ויחיד.
הפונקציה מקבלת אובייקט. נהוג לקרוא לאובייקט הזה אובזרבר כלומר הוא זה שמתבונן ומדווח לנו את הדיווחים ובגלל שהוא אובייקט אחד הורדתי את הסוגריים העגולים.
עכשיו בואו ניקח כאן set interval ול-set אינטרוון נבנה פונקציה שמופעלת כל שנייה. אנחנו רוצים בתוך הפונקציה הזאת להתחיל לדווח. דרך האובזרבר אנחנו מדווחים.
איך אנחנו מדווחים? קוראים לפונקציה שנקראת next ונותנים לה את הערך שאנחנו רוצים לדווח. אז בואו נבנה לעצמנו פה const num שווה math.flor ו-math.random כפול 100. הנה יש לנו כאן מספר רנדומלי בין 0 ל-100 כולל 0 לא כולל 100 אבל זה לא כזה משנה ואנחנו מדווחים אותו.
אז קודם כל ברגע שעשינו את זה אז יש לנו פה דיווחים בלי הפסקה עדיין לא השתמשנו עם ה-count הזה תכף נשתמש איתו. בואו נחשוף החוצה מודול xports@random numbers ונשים את זה פה בצד ונשתמש איתו מה-JS.
אז ב-App.js מה שאנחנו רוצים לעשות זה קודם כל להגדיר קונסט, Random Numbers, רק ווייר, יש לנו פה את המודול Random Numbers.
עכשיו אנחנו פונים ל-Random Numbers, זאת פונקציה שבנינו, כרגע ניתן לה, בעצם האמת אני לא משתמש בזה אז אני אוריד אותו, תכף אני אוסיף אותו.
קראתי לפונקציה ומה שהוחזר לי מהפונקציה זה אובייקט של Observable אז אם הוחזר לי Observable אנחנו יכולים כבר ללחוץ נקודה ול-Observable יש פונקציה שנקראת סאבסקרייב סאבסקרייב זאת פונקציה שמאפשרת להתחיל את התהליך אם אני לא קראתי לסאבסקרייב אז המערכת לא באמת תתחיל את האובזרבבל
סאבסקרייב נרשמת להתחיל לקבל את הדיווחים. כל דיווח בנקסט על ידי נקסט יפעיל את הפונקציה של הסאבסקרייב. פונקציה של הסאבסקרייב מקבלת בתוכה פונקציה בצורה כזאת.
ועכשיו מה אנחנו רוצים לעשות? בואו נניח רק להציג קונסול לוג, רק להציג את המספר על המסך. בואו נבדוק את זה, יש לנו כאן node-app.go ואנחנו רואים שאנחנו מתחילים לקבל דיווחים בלי הפסקה.
כלומר, המערכת הזאת ממשיכה לנצח. בואו נעצור אותו. קונטרול סי עוצר. חוזרים וממשיכים. עכשיו, אנחנו רוצים לשלוח כאן איזשהו מספר, בואו נניח 10, ולחזור לפה, לקבל קאונט, ולדווח רק עשרה מספרים.
זה בעצם מראה שאנחנו לא מדווחים לנצח. איך אנחנו יכולים לעשות את זה? ראשית בואו כל פעם שאנחנו נכנסים לתוך ה-set interval, לתוך הפונקציה ב-set interval ודיווחנו מספר count מינוס מינוס