דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. פניה אסינכרונית והמסתעף Angular TS

פניה אסינכרונית והמסתעף Angular TS

מתוזמן נעוץ נעול הועבר תכנות
22 פוסטים 5 כותבים 565 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • W מנותק
    W מנותק
    WEB
    כתב ב נערך לאחרונה על ידי
    #4

    לא חייבים להפוך לפרומיס, observable הוא מצוין ויכול לעשות הרבה דברים שpromise לא יודע לעשות.
    כמו"כ למה לקרוא לhttp מתוך הconstructor של הservice? מקובל ליצור פונקציה בתוך הservice שהיא מחזירה את הobsevable של הקריאה. הconstructor משמש להזרקה של services אחרים לתוכו.
    אפשר לשים את הפונקציה שקוראת לhttp ישירות בתוך הhtml עם שימוש ב async pipe
    https://angular.io/guide/observables-in-angular#async-pipe

    yyyY תגובה 1 תגובה אחרונה
    1
    • yyyY מנותק
      yyyY מנותק
      yyy
      השיב ליוסף בן שמעון ב נערך לאחרונה על ידי
      #5

      @יוסף-בן-שמעון כתב בפניה אסינכרונית והמסתעף Angular TS:

      this.books = await BooksSvc.GetBooks();
      

      הכנסתי את השורה הזו ל-CTOR וקיבלתי שגיאה
      'await' expressions are only allowed within async functions and at the top levels of modules
      הכנסתי את הנ"ל לפונקציה נוספת בתוך showBooks

      async getBooks() {
       await  this.booksSvc.getBooks()
       }
      

      והשארתי את הקריאה מקונסטרקטור כך:

      this.books=  this.getBooks()
      

      כתוצאה מכך אני מקבל שגיאה

      Type 'Promise<void>' is missing the following properties from type 'Book[]': length, pop, push, concat, and 29 more.
      

      בקיצור לא הולך...

      W י 2 תגובות תגובה אחרונה
      0
      • yyyY מנותק
        yyyY מנותק
        yyy
        השיב לWEB ב נערך לאחרונה על ידי
        #6

        @WEB כתב בפניה אסינכרונית והמסתעף Angular TS:

        לא חייבים להפוך לפרומיס, observable הוא מצוין ויכול לעשות הרבה דברים שpromise לא יודע לעשות.

        אני משתמש ב-observable כדי לקבל מהשרת, אבל אני לא יודע להשתמש בו שרק כאשר יתאכלסו הנתונים מהשרת אל תוך הסרוויס, אז ישלף המידע.

        כמו"כ למה לקרוא לhttp מתוך הconstructor של הservice? מקובל ליצור פונקציה בתוך הservice שהיא מחזירה את הobsevable של הקריאה. הconstructor משמש להזרקה של services אחרים לתוכו.

        כי חשבתי שיהיה הגיוני פעם אחת לשלוף את המידע ולא כל פעם לבדוק האם המידע קיים או לא.

        תגובה 1 תגובה אחרונה
        0
        • W מנותק
          W מנותק
          WEB
          השיב לyyy ב נערך לאחרונה על ידי
          #7

          כתוצאה מכך אני מקבל שגיאה

          Type 'Promise<void>' is missing the following properties from type 'Book[]': length, pop, push, concat, and 29 more.
          

          בקיצור לא הולך...

          אתה מנסה להציב promise (פונקציית async מחזירה promise) לתוך משתנה מסוג []book. וודאי שתקבל שגיאה.

          אני משתמש ב-observable כדי לקבל מהשרת, אבל אני לא יודע להשתמש בו שרק כאשר יתאכלסו הנתונים מהשרת אל תוך הסרוויס, אז ישלף המידע.

          כי חשבתי שיהיה הגיוני פעם אחת לשלוף את המידע ולא כל פעם לבדוק האם המידע קיים או לא.

          בדיוק בשביל זה יש את הפונקציהsubscribe שרצה כאשר יש ערך מוחזר.
          כמו שכתבתי למעלה , אתה יכול להציב פונקציה שמחזירה observable בתוך הhtml עם שימוש ב async pipe
          כך

          {{getBooks() | async}}
          
          תגובה 1 תגובה אחרונה
          1
          • י מנותק
            י מנותק
            יוסף בן שמעון
            כתב ב נערך לאחרונה על ידי
            #8

            observable לא נצרך כאן וזה לא נכון להשתמש בו בסיטואציה הזו
            מדובר על נתונים שנטענים פעם אחת בלבד מהשרת, והאובייקט הזה לא אמור להתעדכן מהשרת יותר, זו התנהגות פרומיסית קלאסית
            observable לא מגיע ככה מהקופסה, אמנם אפשר לקנפג אותו כדי להתאים אותו לצרכים האלו, אבל זה מאולץ ומיותר.

            תגובה 1 תגובה אחרונה
            1
            • י מנותק
              י מנותק
              יוסף בן שמעון
              השיב לyyy ב נערך לאחרונה על ידי יוסף בן שמעון
              #9

              @yyy כתב בפניה אסינכרונית והמסתעף Angular TS:

              בקיצור לא הולך...

              באנגולר לא אמורים לעבוד עם הקונסטרקטור
              הקומפוננטה עשויה להיראות כך:

              export class showBooksComponent implements OnInit {
                  books: Book[];
              
                  constructor(private BooksSvc: BooksSvc) { }
              
                  async ngOnInit() {
                      this.books = await this.BooksSvc.GetBooks();
                  }
              }
              

              זה יאפשר לך לבצע מניפולציות על המערך מתוך הקומפוננטה.
              באופן כללי עדיף להמנע משימוש ב pipes כמו async ובבינדינג לפונקציות, זה מריץ את הפונקציה בכל בינדינג ודורש יותר משאבים.

              yyyY תגובה 1 תגובה אחרונה
              3
              • yyyY מנותק
                yyyY מנותק
                yyy
                השיב ליוסף בן שמעון ב נערך לאחרונה על ידי yyy
                #10

                @יוסף-בן-שמעון
                עשיתי כדבריך:
                זה הסרוויס

                constructor(private httpClient: HttpClient) {
                  this.getBooks();
                }
                getBooks() {
                  return this.Books = this.Books || this.httpClient.get<Book[]>(this.GetBooksURL).toPromise();
                }
                

                זה הקומפוננטה

                constructor(
                   private BookSvc: BookSevice
                 ) {
                 }
                 async ngOnInit() {
                   this.books= await this.BookSvc.getBooks();  
                 }
                

                העניין שכעת לא מתבצעת בכלל פניה לשרת.

                האמת (אני מניח שזה קשור לזה) שגם כך אשמח להכיר את הסינטקס של ה-return הנ"ל בשני דברים:
                א. סימן ה"||" פירושו OR?
                ב. מה המשמעות של קטע הקוד הזה
                this.books = this.books
                ?
                תודה רבה.

                י 2 תגובות תגובה אחרונה
                0
                • י מנותק
                  י מנותק
                  יוסף בן שמעון
                  השיב לyyy ב נערך לאחרונה על ידי
                  #11

                  @yyy כתב בפניה אסינכרונית והמסתעף Angular TS:

                  עשיתי כדבריך:

                  כמעט...
                  איך נראית השורה הזו בסרביס? כמו האופציה הראשונה או השניה?

                     books: Promise<Book[]>;
                     books: Promise<Book[]> = [];
                  
                  
                  yyyY תגובה 1 תגובה אחרונה
                  0
                  • י מנותק
                    י מנותק
                    יוסף בן שמעון
                    השיב לyyy ב נערך לאחרונה על ידי יוסף בן שמעון
                    #12

                    @yyy כתב בפניה אסינכרונית והמסתעף Angular TS:

                    האמת (אני מניח שזה קשור לזה) שגם כך אשמח להכיר את הסינטקס של ה-return הנ"ל בשני דברים:
                    א. סימן ה"||" פירושו OR?
                    ב. מה המשמעות של קטע הקוד הזה
                    this.books = this.books
                    ?

                    אכן, זה אופרטור OR.
                    כשאתה מבצע השמה למשתנה books אתה קודם כל בודק אם הוא כבר מאותחל, במידה והוא כבר אותחל אתה לא משנה בו כלום אלא מצביע עליו בחזרה, אם הוא עוד לא מאותחל והוא מחזיר undefined (שזה ערך false ב JS) אז אתה מאתחל אותו כפרומיס.
                    כך אתה מרויח שהפניה לשרת תתבצע רק פעם אחת בכל חיי האפליקציה, וכל מי שירצה לקבל את רשימת הספרים יקבל אותה מהפרומיס הזה

                    yyyY תגובה 1 תגובה אחרונה
                    1
                    • yyyY מנותק
                      yyyY מנותק
                      yyy
                      השיב ליוסף בן שמעון ב נערך לאחרונה על ידי
                      #13

                      @יוסף-בן-שמעון כתב בפניה אסינכרונית והמסתעף Angular TS:

                      books: Promise<Book[]>;
                      books: Promise<Book[]> = [];

                      לא כך ולא כך, אלא כך:

                      books:Books[] = [];
                      


                      זה:

                      books: Promise<Books[]>;
                      

                      מחזיר את השגיאה הזו
                      'books' has no initializer and is not definitely assigned in the constructor.
                      ואז אני מוסיף סימן ? ומקבל שגיאה ב-return

                      Type 'Promise<book[] | undefined>' is not assignable to type 'Promise<book[]>'.
                        Type book[] | undefined' is not assignable to type book[]'.
                          Type 'undefined' is not assignable to type book[]'.ts(2322)
                      

                      וזה:

                      books: Promise<Book[]> = [];
                      

                      מחזיר שגיאה:

                      Type 'never[]' is missing the following properties from type 'Promise<Book[]>': then, catch, finally, [Symbol.toStringTag]
                      
                      י תגובה 1 תגובה אחרונה
                      0
                      • י מנותק
                        י מנותק
                        יוסף בן שמעון
                        השיב לyyy ב נערך לאחרונה על ידי
                        #14

                        @yyy כתב בפניה אסינכרונית והמסתעף Angular TS:

                        זה:

                        books: Promise<Books[]>;
                        מחזיר את השגיאה הזו
                        'books' has no initializer and is not definitely assigned in the constructor.

                        אתה יכול לכתוב במקום סימן שאלה סימן קריאה, וזה ידלג על הבדיקה
                        או לאתחל את זה בקונסטקטור בלי האופרטור || ובמתודה getBooks רק להחזיר אותו בלי לעשות השמה

                        תגובה 1 תגובה אחרונה
                        1
                        • yyyY מנותק
                          yyyY מנותק
                          yyy
                          השיב ליוסף בן שמעון ב נערך לאחרונה על ידי
                          #15

                          @יוסף-בן-שמעון כתב בפניה אסינכרונית והמסתעף Angular TS:

                          כשאתה מבצע השמה למשתנה books אתה קודם כל בודק אם הוא כבר מאותחל,

                          זה נכון לגבי כל השמה, או שזה משהו ספציפי לפקודת return?

                          במידה והוא כבר אותחל אתה לא משנה בו כלום אלא מצביע עליו בחזרה,

                          למה פקודה כזו

                          return this.books || this.httpClient.get<Books []>(this.Getbooks URL).toPromise();
                          

                          לא מבצעת אותו דבר, הרי אם האובייקט אינו מאותחל זה יחזיר undefind כלומר false, וילך לפרומיס לאתחל את האובייקט, ואם זה כן מאותחל כלומר true שיחזיר אותו עצמו ולא יפנה לפרומייס?
                          בדקתי ואכן בסינטקס שלי הוא כן פונה כל פעם מחדש ואני רק שואל למה זה קורה.

                          א י 2 תגובות תגובה אחרונה
                          1
                          • yyyY מנותק
                            yyyY מנותק
                            yyy
                            כתב ב נערך לאחרונה על ידי
                            #16

                            אגב ה-toPromise בהקשר זה הוא depricated

                            תגובה 1 תגובה אחרונה
                            1
                            • א מנותק
                              א מנותק
                              אהרן
                              השיב לyyy ב נערך לאחרונה על ידי
                              #17

                              @yyy כתב בפניה אסינכרונית והמסתעף Angular TS:

                              למה פקודה כזו

                              return this.books || this.httpClient.get<Books []>(this.Getbooks URL).toPromise();
                              

                              לא מבצעת אותו דבר, הרי אם האובייקט אינו מאותחל זה יחזיר undefind כלומר false, וילך לפרומיס לאתחל את האובייקט, ואם זה כן מאותחל כלומר true שיחזיר אותו עצמו ולא יפנה לפרומייס?
                              בדקתי ואכן בסינטקס שלי הוא כן פונה כל פעם מחדש ואני רק שואל למה זה קורה.

                              כי אתה אף פעם לא מאתחל אותו.

                              תגובה 1 תגובה אחרונה
                              2
                              • י מנותק
                                י מנותק
                                יוסף בן שמעון
                                השיב לyyy ב נערך לאחרונה על ידי
                                #18

                                @yyy כתב בפניה אסינכרונית והמסתעף Angular TS:

                                זה נכון לגבי כל השמה, או שזה משהו ספציפי לפקודת return?

                                כל השמה

                                @yyy כתב בפניה אסינכרונית והמסתעף Angular TS:

                                למה פקודה כזו

                                returnthis.books || this.httpClient.get<Books []>(this.Getbooks URL).toPromise();
                                לא מבצעת אותו דבר, הרי אם האובייקט אינו מאותחל זה יחזיר undefind כלומר false, וילך לפרומיס לאתחל את האובייקט, ואם זה כן מאותחל כלומר true שיחזיר אותו עצמו ולא יפנה לפרומייס?
                                בדקתי ואכן בסינטקס שלי הוא כן פונה כל פעם מחדש ואני רק שואל למה זה קורה.

                                כפי שכתב אהרן, בתחביר שלך אתה לא מאתחל אותו אף פעם, אז הוא תמיד נשאר undefined, ולכן כך קריאה לפונקציה תייצר פניה לשרת.
                                אם תנסה לפרק את הסינטקס הזה לגורמים, זה יראה כך:

                                getBooks() {
                                  if (this.books !== undefined) {
                                    return this.books;
                                  } else {
                                    this.books = this.httpClient.get<Book[]>(this.GetBooksURL).toPromise(); // <<<<<<<<<<<<<<<
                                    return this.books;
                                  }
                                }
                                

                                אצלך דילגת על שורה 5, ובמקום זה עשית כך:

                                getBooks() {
                                  if (this.books !== undefined) {
                                    return this.books;
                                  } else {
                                    return this.httpClient.get<Book[]>(this.GetBooksURL).toPromise();
                                  }
                                }
                                

                                אז books מעולם לא אותחל

                                yyyY תגובה 1 תגובה אחרונה
                                2
                                • yyyY מנותק
                                  yyyY מנותק
                                  yyy
                                  השיב ליוסף בן שמעון ב נערך לאחרונה על ידי
                                  #19

                                  @יוסף-בן-שמעון
                                  הטעות שלי היית שחשבתי שהתכוונת
                                  לזה

                                  return (this.Books = this.Books )|| this.httpClient.get<Book[]>(this.GetBooksURL).toPromise();
                                  

                                  ולא הבנתי מה ההצבה המוזרה באופרנד הראשון
                                  בשעה שהתכוונת באמת לזה:

                                  return this.Books = (this.Books || this.httpClient.get<Book[]>(this.GetBooksURL).toPromise());
                                  
                                  תגובה 1 תגובה אחרונה
                                  1
                                  • yyyY מנותק
                                    yyyY מנותק
                                    yyy
                                    כתב ב נערך לאחרונה על ידי yyy
                                    #20

                                    עכשיו ברשותכם שאלות:
                                    א.
                                    הפונקציה בסרוויס

                                    getBooks() {
                                      return this.Books = this.Books || this.httpClient.get<Book[]>(this.GetBooksURL).toPromise();
                                    } 
                                    

                                    מחזירה פרומיס
                                    אבל הפונקציה בקומפוננטה

                                    async ngOnInit() {
                                      this.books= await this.BookSvc.getBooks();
                                    

                                    מקבלת []Book ,
                                    השאלה היא האם הסיבה שמתבצעת ההמרה האוטומטית הזו, למרות שמדובר ב-TS, זה בגלל שיש async/await הוא מבין שהוא צריך לחלץ את הערך מהפרומיס?

                                    ב. אני מנסה לחבר את פרומיס זה לרעיון הכללי של פרומיס. אני ידעתי שהמצב של הפרומיס מוגדר ע"י הרצת resolve/reject, ואז פונים לthen או catch וכדו'. השאלה היא מי מריץ כאן מאחור את כל הפונקציות האלו הרי בקוד אני לא נוגע כאן ב-resolve then ודומיהם?

                                    תגובה 1 תגובה אחרונה
                                    0
                                    • dovidD מנותק
                                      dovidD מנותק
                                      dovid ניהול
                                      כתב ב נערך לאחרונה על ידי dovid
                                      #21

                                      @yyy המילה await אומרת: קודם תריץ, כשמסתיים תביא לי את הערך החוזר.
                                      זה בעצם מעביר את ההצבה למשתנה לתוך בלוק דמיוני של then לפעולה הפורמיסית.
                                      ממילא:

                                      var promise:Promise<number> = new Promise<number>(success => success(555));
                                      var num:number = await promise;
                                      

                                      זה שקול לקוד הבא:

                                      var num:number;
                                      var promise:Promise<number> = new Promise<number>(success => success(555));
                                      promise.then(function(n){
                                          num = n;
                                      });
                                      

                                      ואכן בלי המילה await באמת הסוג הוא פרומייס לכל דבר.
                                      ככה זה גם בדיוק בJS (אני בכלל לא מכיר TS).

                                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                      תגובה 1 תגובה אחרונה
                                      2
                                      • dovidD מנותק
                                        dovidD מנותק
                                        dovid ניהול
                                        כתב ב נערך לאחרונה על ידי
                                        #22

                                        יש לציין שלא רק ההצבה שלפני המילה await נכנסת לבלוק של then, אלא כל הקוד שאחריה עד סוף הפונקציה.
                                        אם יש כמה פעמים await זה כמו then אחד בתוך השני, או כמו קלאבקים מקוננים (שנקראו בזמנו גיהנום קלאבקים).

                                        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                        בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                        תגובה 1 תגובה אחרונה
                                        2

                                        • 1
                                        • 2
                                        בא תתחבר לדף היומי!
                                        • התחברות

                                        • אין לך חשבון עדיין? הרשמה

                                        • התחברו או הירשמו כדי לחפש.
                                        • פוסט ראשון
                                          פוסט אחרון
                                        0
                                        • דף הבית
                                        • קטגוריות
                                        • פוסטים אחרונים
                                        • משתמשים
                                        • חיפוש
                                        • חוקי הפורום