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

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

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

עזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS)

מתוזמן נעוץ נעול הועבר תכנות
25 פוסטים 5 כותבים 416 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • צדיק תמיםצ מנותק
    צדיק תמיםצ מנותק
    צדיק תמים
    השיב לShaya ב נערך לאחרונה על ידי
    #11

    @shaya קודם כל את הקוד ההוא באמת גם לי היה קשה להבין... 💫
    אני צריך למצוא זמן יותר מתאים לקרוא בעיון את הקוד שלך (והמראי מקומות), אבל למעשה כתבתי את הקוד הזה:
    שאמנם הוא חסר את הסדר שלך (למשל בהגדרת YOUTUBE_SEARCH_ENDPOINT שמקצר את שורת הקריאה בפועל), אבל הוא קצר בהרבה מהקוד שלך (וכמובן פועל היטב).
    אני אישית סובר שקוד טוב הוא קוד חסכני (כמובן שמשיג את אותה תוצאה, ובצורה שברורה לי).

    async function lulaa(ChannelID) {
      let arryYT = []
      let a1 = {
        nextPageToken: "",
      }
      let artToken = ""
      do {
        a1 = await fetch(`https://www.googleapis.com/youtube/v3/search?key=` + TokenAPI() + `&channelId=${ChannelID}&part=id&order=date&maxResults=50${artToken}${a1.nextPageToken}`)
        a1 = await a1.json()
        a1.items.forEach((parit, index) => {
          if (parit.id.kind === "youtube#video") {
            arryYT.push(parit.id.videoId)
          }
        })
        artToken = "&pageToken="
      } while (await a1.nextPageToken)
      console.log(arryYT)
    }
    
    function TokenAPI() {
      return "AIzaSyBUtCAp82VCsH5z3XmTMy1KMnLQ1g3Cqm0"
    }
    

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

    Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
    טיפים

    י תגובה 1 תגובה אחרונה
    0
    • י מנותק
      י מנותק
      יוסף בן שמעון
      השיב לצדיק תמים ב נערך לאחרונה על ידי
      #12

      @צדיק-תמים אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):

      אני אישית סובר שקוד טוב הוא קוד חסכני (כמובן שמשיג את אותה תוצאה, ובצורה שברורה לי).

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

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

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

        @יוסף-בן-שמעון אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):

        שם משתנה a1 זה לא תקין בעליל

        אכן,
        זה לא אמור להישאר ככה, זה רק בשביל כתיבת עצם הקוד, ככה יותר נוח.
        למעשה אח"כ אני משכתב את שמות המשתנים והפונקציות

        @יוסף-בן-שמעון אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):

        הוא משמש לכמה דברים בזה אחר זה

        איזה דברים?
        אני מגדיר אותו קודם כל כמערך עם מחרוזת ריקה בnextPageToken, בשביל תקינות הקריאה הראשונה.
        חוץ מזה אין עוד שימוש

        Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
        טיפים

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

          @צדיק-תמים אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):

          @יוסף-בן-שמעון אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):

          הוא משמש לכמה דברים בזה אחר זה

          איזה דברים?
          אני מגדיר אותו קודם כל כמערך עם מחרוזת ריקה בnextPageToken, בשביל תקינות הקריאה הראשונה.
          חוץ מזה אין עוד שימוש

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

          אתה ניצב מול בעיה, איך לבצע את הבקשה הראשונה בלי להכשל, וכדי להתמודד איתה אתה יוצר מעקף ע"י משתנה עם מחרוזת ריקה, זה מעקף, זה לא הדרך הנכונה, הדרך הנכונה היא להסתכל לבעיה בעיניים ולפתור אותה מהשורש

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

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

            @יוסף-בן-שמעון אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):

            יש מחלקה בשם URL שלוקחת פרמטרים ומחזירה URL תקין עם פרמטרי חיפוש ושאר ירקות

            אשמח להרחבה, ובכלל הייתי שמח להעמיק קצת יותר בכל העניין של כתיבה נכונה של קוד (או לפחות בעניינים ש @Shaya נגע)... זה אכן דבר חשוב.
            אולי @dovid יוכל לפצל את הפוסטים האחרונים לנושא חדש?

            Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
            טיפים

            י תגובה 1 תגובה אחרונה
            0
            • י מנותק
              י מנותק
              יוסף בן שמעון
              השיב לצדיק תמים ב נערך לאחרונה על ידי
              #16

              @צדיק-תמים אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):

              אשמח להרחבה

              תראה לדוגמא את הקוד הזה

              const url = new URL('https://www.googleapis.com/youtube/v3/search');
              url.searchParams.append('channelId', channelId);
              if (nextPageToken) url.searchParams.append('pageToken', nextPageToken);
              console.log(url.toString());
              

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

              @צדיק-תמים אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):

              ובכלל הייתי שמח להעמיק קצת יותר בכל העניין של כתיבה נכונה של קוד

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

              כדאי מאד גם להצמד לתקנים אוניברסליים, לדוגמא פונקציה שמחזירה ערך אמורה להתחיל ב get, כמו getToken ופונקציה שאמורה להגדיר ערך אמורה להתחיל ב set, מחלקה מתחילה באות גדולה, פונקציה מתחילה באות קטנה, כל הדברים האלה עוזרים להבנת הקוד

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

                @יוסף-בן-שמעון כמו שכתבתי קודם השמות הם זמניים, יותר נוח לי להכין את הקטע קוד (כשמדובר בקטע מורכב ולא שאני כותב וזהו) עם שמות זמניים וקצרים שיותר מובנים לי במשמעות של הקטע הספציפי, ולאחר מכן כשאני משלב את זה בסקריפט אני נותן לזה מחדש שמות לפי המשמעות ביחס לפעולה הכללית של הסקריפט.
                לגבי המחלקה URL והדוגמה שהבאת - זה נראה ממש מעולה, לא הכרתי את זה קודם (וגם כמדומני לא נתקלתי בזה בסקריפטים וקטעי קוד אחרים ברשת).
                ולגבי העניין של להגדיר משתנה מחדש - אז לי אישית יותר קשה להבין קוד שלוקח נתון ומכניס אותו לתוך משתנה x, ואז מוטציה על x שמוכנסת לy, וכן הלאה, כשלמעשה בסופו של דבר משתמשים רק במוטציה האחרונה - לדוגמה y, אז מה העניין בעצם 'לשרשר' את זה? כל עוד אני צריך רק את התוצאה הסופית, למה לא לערוך את המשתנה הראשוני ולהכניס בו את התוכן לאחר העריכה, ולהשתמש בו?
                במראה מקום הזה ששעייה הביא, בעצם כתוב שיש עניין ליצור למשל את האובייקט כבלתי ניתן לשינוי, אבל לא הבנתי מה מרוויחים מזה באמת?

                Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
                טיפים

                תגובה 1 תגובה אחרונה
                1
                • צדיק תמיםצ מנותק
                  צדיק תמיםצ מנותק
                  צדיק תמים
                  כתב ב נערך לאחרונה על ידי צדיק תמים
                  #18

                  @יוסף-בן-שמעון הנה קטע קוד סופי לדוגמה:

                    /**
                     * קבל מזהה סרטון, החזר שם סרטון, שם ערוץ, ומזהה ערוץ
                     * @param {string} VideoID מזהה סרטון יוטיוב
                     */
                  async function getChannelForVideoID(VideoID) {
                    const GET_INFO_FOR_VIDEO_ID = new URL("https://www.googleapis.com/youtube/v3/videos")
                    GET_INFO_FOR_VIDEO_ID.searchParams.append("id", VideoID)
                    GET_INFO_FOR_VIDEO_ID.searchParams.append("key", getTokenAPI())
                    GET_INFO_FOR_VIDEO_ID.searchParams.append("part", "snippet")
                    GET_INFO_FOR_VIDEO_ID.searchParams.append("fields", "items(snippet(channelTitle,channelId,title))")
                    console.log(GET_INFO_FOR_VIDEO_ID.toString())
                    const infoVideo_Raw = await fetch(GET_INFO_FOR_VIDEO_ID)
                    let infoVideo_Object = await infoVideo_Raw.json()
                    let videoINFO = [infoVideo_Object.items[0].snippet.channelId, infoVideo_Object.items[0].snippet.channelTitle, infoVideo_Object.items[0].snippet.title]
                    return videoINFO
                  }
                  console.log(await getChannelForVideoID("upjlMAKR-_0"))
                  

                  זה מספיק ברור? או שיש עוד מה לשפר (כמובן אני לא שואל בשביל הקטע הזה ספציפית, אלא לידיעה כללית)
                  מתייג גם את @Shaya

                  Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
                  טיפים

                  י dovidD 2 תגובות תגובה אחרונה
                  3
                  • י מנותק
                    י מנותק
                    יוסף בן שמעון
                    השיב לצדיק תמים ב נערך לאחרונה על ידי
                    #19

                    @צדיק-תמים ברור וקריא מאד
                    רק בקטנה, השם של המשתנה שבונה את ה URL לא אמור להיות GET_INFO_FOR_VIDEO_ID, כי זה לא פונקציה שמחזירה ערך, זה סה"כ URL חביב, צריך לקרוא לו כפשוטו url
                    ועוד משהו קטן, אין צורך לפצל את שורות 12 ו 13, זה יכול להיות פקודה אחת, כי אתה לא משתמש בפרומיס שמוחזר בשורה 12 אלא רק לצורך חילוץ הגייסון, אז זה יכול להיות כך

                      const infoVideo_Object = await fetch(GET_INFO_FOR_VIDEO_ID).then(res => res.json())
                    
                    תגובה 1 תגובה אחרונה
                    3
                    • dovidD מנותק
                      dovidD מנותק
                      dovid ניהול
                      השיב לצדיק תמים ב נערך לאחרונה על ידי
                      #20

                      @צדיק-תמים מהירות השיפור שלך מדהימה, חזק ואמץ.

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

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

                      תגובה 1 תגובה אחרונה
                      5
                      • צדיק תמיםצ מנותק
                        צדיק תמיםצ מנותק
                        צדיק תמים
                        כתב ב נערך לאחרונה על ידי צדיק תמים
                        #21

                        @יוסף-בן-שמעון למעשה למרות שהשתמשתי בשיטה של יצירת מופע של URL (וגם הכנסתי את התיקון שלך כאן, אבל זה כבר לא קשור כל כך...) נצרכתי לטריקים מעין זה...
                        זה הקוד שיצא לי: ראה קוד מתוקן בהמשך
                        רק משום מה זה לא מדפיס בסוף את arryYT (המערך המלא)... אבל כל הנתונים כן מתקבלים, ומודפסים כל אחד בתורו בשורה 25.

                        Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
                        טיפים

                        י תגובה 1 תגובה אחרונה
                        0
                        • י מנותק
                          י מנותק
                          יוסף בן שמעון
                          השיב לצדיק תמים ב נערך לאחרונה על ידי יוסף בן שמעון
                          #22

                          @צדיק-תמים לא הבנתי לאיזה טריקים התכוונת
                          (בשורה 15 כנראה התכוונת ל

                          if (nextPageToken)
                          
                          תגובה 1 תגובה אחרונה
                          1
                          • צדיק תמיםצ מנותק
                            צדיק תמיםצ מנותק
                            צדיק תמים
                            כתב ב נערך לאחרונה על ידי צדיק תמים
                            #23

                            @יוסף-בן-שמעון למעשה התברר לי שבכלל לא מתקבלים הנתונים שאני מחפש... והכל בגלל אות אחת - pert (במקום part)... 😳
                            הנה קוד מתוקן:

                            /**
                             * קבל מזהה ערוץ, חלץ (והחזר) רשימת מזהי סרטונים (כמערך)
                             * @param {string} upledsChannelID מזהה ערוץ
                             */
                            async function getVideoListForPlayList(upledsChannelID) {
                              let arrayVideoID = []
                              let nextPageToken = ""
                              let listVideo_Object
                              do {
                                const urlFetch = new URL("https://www.googleapis.com/youtube/v3/playlistItems")
                                urlFetch.searchParams.append("part", "id,contentDetails")
                                urlFetch.searchParams.append("playlistId", upledsChannelID)
                                urlFetch.searchParams.append("maxResults", 50)
                                urlFetch.searchParams.append("key", getTokenAPI())
                                if (nextPageToken) urlFetch.searchParams.append("pageToken", nextPageToken)
                                const urlFetchEnd = urlFetch.toString()
                                console.log(urlFetchEnd)
                                listVideo_Object = await fetch(urlFetchEnd).then((res) => res.json())
                                nextPageToken = listVideo_Object.nextPageToken
                                console.log(Math.ceil((await listVideo_Object.pageInfo.totalResults) / 50))
                                listVideo_Object.items.forEach((parit, index) => {
                                  // if (parit.id.kind === "youtube#video") {
                                    arrayVideoID.push(parit.contentDetails.videoId)
                                  // }
                                })
                                console.log(listVideo_Object)
                              } while (listVideo_Object.nextPageToken)
                              console.log(arrayVideoID)
                              return arrayVideoID
                            }
                            
                            //בדיקה לדוגמה
                            console.log(await getVideoListForPlayList("UUzlw5vTVVMPwBKElMt3gYQw"))
                            
                            //מפתח API (במקור מחזיר לפי מה שהמשתמש קבע וכו')
                            function getTokenAPI() {
                              return "AIzaSyAZIKWeEBpgEqZd64gkLxjOhNj4mgy7rZ0"
                            }
                            
                            

                            כשאני אומר טריק אני מתכוון לשורות 7, 19

                            Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
                            טיפים

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

                              @צדיק-תמים זה מעולה, זה בכלל לא טריק, אתה חייב להצהיר על המשתנה nextPageToken שיהיה זמין לכל הפונקציה בשביל האיטרציה הבאה של הלולאה
                              מה שכן, אתה לא חייב לאתחל אותו כמחרוזת ריקה, אלא להשאיר אותו מוצהר, התוצאה תהיה אותה תוצאה.
                              בקוד הישן שלך זה היה טריק כי רצית להשתמש עם האובייקט שמתקבל כתשובה מהשרת, שהוא מכיל את הטוקן של הדף הבא, אז עשית אוביקט דמה שמכיל רק את הטוקן, וזה לא תקין, אבל עכשיו עשית מתשנה מיוחד בשביל הטוקן וזה מצוין.

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

                                @צדיק-תמים אם אתה ממש מתעקש, אפשר לשפר את הפונקציה, כי היא עושה בעצם כמה דברים, וכלל נקוט בידינו שאין פונקציה אחת עושה שני שליחויות
                                אתה יכול להפריד את זה לפונקציה אחת שתהיה אחראית לבניה של ה URL, ופונקציה נוספת שתשלח את הבקשה לשרת.

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

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

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

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