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

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

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

לולאה שנתקעת ומדלגת פריטים

מתוזמן נעוץ נעול הועבר תכנות
14 פוסטים 3 כותבים 213 צפיות 2 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY yossiz

    @אבי-203 אמר בלולאה שנתקעת ומדלגת פריטים:

    אני לא משתמש עד שאבין...

    🙂

    למשל למה בפעם השניה הזו
    Promise.all(anashim.map(item4 => {
    למה לא הוספת await

    אתה צודק. אין סיבה להשתמש ב-Promise.all בלי לחכות לתוצאה.

    וגם איפה למשל אני מבין שהסתימו שני התהליכים ורק לאחר מכן תכניס הודעה הסתיים סגור חלון וכדו'.

    אחרי שחכית ל-promise.all.

    await Promise.all(myArray.map(item => doSomeAsyncOperationOnItem()));
    console.log('הפעולה הסתיימה בהצלחה!');
    

    אולי החטא הקדמון שלא הבנתי את מהות promise

    לא "אולי", אלא ודאי 🙂 . אבל לצערנו, אתה לא היחיד, יש הרבה אנשים (בלי לנקוב בשמות... undefined ) שכותבים JS שנים ולא מבינים טוב מהות promise. אם תשקיע להבין את זה טוב, אני יכול לכתוב די בביטחון שההשקעה תחזיר את עצמה במהירות.

    אבי 203א מנותק
    אבי 203א מנותק
    אבי 203
    כתב ב נערך לאחרונה על ידי אבי 203
    #5

    @yossiz
    אני מעדכן שני רשימות. אז אני שם את זה אחרי השני הם אכן ממתינים אחד לשני? אני חושב ששוב לא הבנתי.

    await Promise.all(dard.map(item => {
      return wixData.get('card', item._id)
        .then((item2) => {
          console.log(item2);
          item2.print = 'הודפס';
          return wixData.update('card', item2).catch(err => err)
    	      })
        .catch((err) => {
          const errorMsg = err;
        });
    }))
    await Promise.all(anashim.map(item4 => {
      return wixData.get('tormim', item4._id)
        .then((item6) => {
          console.log(item6);
          item6.print = 'הודפס';
          return wixData.update('tormim', item6).catch(err => err)
    
        })
        .catch((err) => {
          const errorMsg = err;
        });
    })) .then(() => {
    console.log("הסתיים");
     })
    
    yossizY תגובה 1 תגובה אחרונה
    0
    • אבי 203א אבי 203

      @yossiz
      אני מעדכן שני רשימות. אז אני שם את זה אחרי השני הם אכן ממתינים אחד לשני? אני חושב ששוב לא הבנתי.

      await Promise.all(dard.map(item => {
        return wixData.get('card', item._id)
          .then((item2) => {
            console.log(item2);
            item2.print = 'הודפס';
            return wixData.update('card', item2).catch(err => err)
      	      })
          .catch((err) => {
            const errorMsg = err;
          });
      }))
      await Promise.all(anashim.map(item4 => {
        return wixData.get('tormim', item4._id)
          .then((item6) => {
            console.log(item6);
            item6.print = 'הודפס';
            return wixData.update('tormim', item6).catch(err => err)
      
          })
          .catch((err) => {
            const errorMsg = err;
          });
      })) .then(() => {
      console.log("הסתיים");
       })
      
      yossizY מנותק
      yossizY מנותק
      yossiz
      כתב ב נערך לאחרונה על ידי yossiz
      #6

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

      • לכאורה תוכל גם לעדכן את שתי הרשימות במקביל, אם אין תלויות בין אחד לשני.
      • כדאי להשתמש במשתנים עם שמות תיאוריים, משתמש שהוא מערך, תן לו שם בלשון רבים. משתנה שהוא אובייקט מסוג card תקרא לו card ולא רק item סתמי, וכו' על זה הדרך. כן, אם יש כמה משתנים מסוג card אל תקרא להם card1, card2 אלא תן להם שמות לפי השימוש שלהם בקוד - לדוגמה newCard, updatedCard וכן על זה הדרך. לא כדאי להשתמש בראשי תיבות, לא עולה כסף לכתוב במילואו.
      • יש שתי דרכים להתנהל עם פרומיסים: הדרך הישנה: שימוש ב-API של הפרומיסים, כלומר: then ו-catch. הדרך החדשה: שמוש במילות המפתח - async ו-await.
        (לדעתי) מומלץ להיות עקבי בצורת ההתנהלות ולא לקפוץ בין אחד לשני כל הזמן.
        יש אומנם מקומות שבהם אין מנוס מלהשתמש ב-API של הפרומיסים, לדוגמה: אין תחליף לפונקציית Promise.all בתחביר ה-async/await-י. ובמקרים אלו ההכרח לא יגונה.
      • אם הקוד שמעדכן את רשימת ה-anashim זהה לקוד שמעדכן את ה-cards, ניתן לצרף אותם יחד לפונקציה ג'נרית לעדכון רשימה.
      • אאל"ט, אין צורך למשוך את האובייקט שוב מה-DB של WIX כדי לעדכן אותו, ניתן להשתמש באובייקט מהרשימה.

      על פי כל הנ"ל, הייתי משכתב את הקוד שלך כך:

      function updateItemPrinted (table, item) {
        item.print = 'הודפס';
        return wixData.update(table, item);
      }
      
      await Promise.all([
        ...cards.map((card) => updateItemPrinted('card', card)),
        ...anashim.map(torem => updateItemPrinted('tormim', torem))
      ]);
      
      console.log('הסתיים');
      

      קצר וקולע.
      יפה, לא?

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      אבי 203א תגובה 1 תגובה אחרונה
      3
      • yossizY yossiz

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

        • לכאורה תוכל גם לעדכן את שתי הרשימות במקביל, אם אין תלויות בין אחד לשני.
        • כדאי להשתמש במשתנים עם שמות תיאוריים, משתמש שהוא מערך, תן לו שם בלשון רבים. משתנה שהוא אובייקט מסוג card תקרא לו card ולא רק item סתמי, וכו' על זה הדרך. כן, אם יש כמה משתנים מסוג card אל תקרא להם card1, card2 אלא תן להם שמות לפי השימוש שלהם בקוד - לדוגמה newCard, updatedCard וכן על זה הדרך. לא כדאי להשתמש בראשי תיבות, לא עולה כסף לכתוב במילואו.
        • יש שתי דרכים להתנהל עם פרומיסים: הדרך הישנה: שימוש ב-API של הפרומיסים, כלומר: then ו-catch. הדרך החדשה: שמוש במילות המפתח - async ו-await.
          (לדעתי) מומלץ להיות עקבי בצורת ההתנהלות ולא לקפוץ בין אחד לשני כל הזמן.
          יש אומנם מקומות שבהם אין מנוס מלהשתמש ב-API של הפרומיסים, לדוגמה: אין תחליף לפונקציית Promise.all בתחביר ה-async/await-י. ובמקרים אלו ההכרח לא יגונה.
        • אם הקוד שמעדכן את רשימת ה-anashim זהה לקוד שמעדכן את ה-cards, ניתן לצרף אותם יחד לפונקציה ג'נרית לעדכון רשימה.
        • אאל"ט, אין צורך למשוך את האובייקט שוב מה-DB של WIX כדי לעדכן אותו, ניתן להשתמש באובייקט מהרשימה.

        על פי כל הנ"ל, הייתי משכתב את הקוד שלך כך:

        function updateItemPrinted (table, item) {
          item.print = 'הודפס';
          return wixData.update(table, item);
        }
        
        await Promise.all([
          ...cards.map((card) => updateItemPrinted('card', card)),
          ...anashim.map(torem => updateItemPrinted('tormim', torem))
        ]);
        
        console.log('הסתיים');
        

        קצר וקולע.
        יפה, לא?

        אבי 203א מנותק
        אבי 203א מנותק
        אבי 203
        כתב ב נערך לאחרונה על ידי
        #7

        @yossiz אמר בלולאה שנתקעת ומדלגת פריטים:

        table

        חלישות הדעת!

        רק להבין אבל מה זה table?
        שם של מסד הנתונים? איפה שלחת את זה?

        yossizY תגובה 1 תגובה אחרונה
        1
        • אבי 203א אבי 203

          @yossiz אמר בלולאה שנתקעת ומדלגת פריטים:

          table

          חלישות הדעת!

          רק להבין אבל מה זה table?
          שם של מסד הנתונים? איפה שלחת את זה?

          yossizY מנותק
          yossizY מנותק
          yossiz
          כתב ב נערך לאחרונה על ידי yossiz
          #8

          @אבי-203 אופסס... טעות שלי ("כל המתיהר וכו' חכמתו מסתלקת"...). תיקנתי בקוד.

          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

          אבי 203א תגובה 1 תגובה אחרונה
          1
          • yossizY yossiz

            @אבי-203 אופסס... טעות שלי ("כל המתיהר וכו' חכמתו מסתלקת"...). תיקנתי בקוד.

            אבי 203א מנותק
            אבי 203א מנותק
            אבי 203
            כתב ב נערך לאחרונה על ידי
            #9

            @yossiz לא אתן לך על האחרונה לייק... 🙂
            אבל עדין חסר לי.
            אני מריץ את הלולאה על אובייקטים (anashim,dard) שנבנים בפונקצייה אחרת בפעולת ההורדה של הPDF.
            ואז הפונקצייה הזו אמורה לעדכן במסד הנתונים לא באובייקט, למסד הנתונים קוראים tormim , card/

            וממה שכתבת נראה שהעדכון הוא באובייקט לא במסד הנתונים. אני טועה? או שמה שצבוע באדום זה ההדמייה שלך לשם מסד הנתונים
            updateItemPrinted('card', card)),

            yossizY תגובה 1 תגובה אחרונה
            0
            • אבי 203א אבי 203

              @yossiz לא אתן לך על האחרונה לייק... 🙂
              אבל עדין חסר לי.
              אני מריץ את הלולאה על אובייקטים (anashim,dard) שנבנים בפונקצייה אחרת בפעולת ההורדה של הPDF.
              ואז הפונקצייה הזו אמורה לעדכן במסד הנתונים לא באובייקט, למסד הנתונים קוראים tormim , card/

              וממה שכתבת נראה שהעדכון הוא באובייקט לא במסד הנתונים. אני טועה? או שמה שצבוע באדום זה ההדמייה שלך לשם מסד הנתונים
              updateItemPrinted('card', card)),

              yossizY מנותק
              yossizY מנותק
              yossiz
              כתב ב נערך לאחרונה על ידי
              #10

              @אבי-203 אמר בלולאה שנתקעת ומדלגת פריטים:

              למסד הנתונים קוראים tormim , card/

              גם כאן אתה צודק, כתבתי anashim במקום tormim. תיקנתי.
              עכשיו מובן? ייתכן שיש עדיין טעויות...
              (קיצרתי בקוד, צריך להוסיף טיפול בשגיאות)

              📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

              אבי 203א תגובה 1 תגובה אחרונה
              1
              • yossizY yossiz

                @אבי-203 אמר בלולאה שנתקעת ומדלגת פריטים:

                למסד הנתונים קוראים tormim , card/

                גם כאן אתה צודק, כתבתי anashim במקום tormim. תיקנתי.
                עכשיו מובן? ייתכן שיש עדיין טעויות...
                (קיצרתי בקוד, צריך להוסיף טיפול בשגיאות)

                אבי 203א מנותק
                אבי 203א מנותק
                אבי 203
                כתב ב נערך לאחרונה על ידי
                #11

                @yossiz לא עובד טוב 😞
                מה יכול להיות???

                dovidD תגובה 1 תגובה אחרונה
                0
                • אבי 203א אבי 203

                  @yossiz לא עובד טוב 😞
                  מה יכול להיות???

                  dovidD מנותק
                  dovidD מנותק
                  dovid
                  ניהול
                  כתב ב נערך לאחרונה על ידי
                  #12

                  @אבי-203 אתה צריך ללמוד javaScript כמו ילד טוב, אין מנוס.

                  • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                  • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                  אבי 203א תגובה 1 תגובה אחרונה
                  3
                  • dovidD dovid

                    @אבי-203 אתה צריך ללמוד javaScript כמו ילד טוב, אין מנוס.

                    אבי 203א מנותק
                    אבי 203א מנותק
                    אבי 203
                    כתב ב נערך לאחרונה על ידי
                    #13
                    פוסט זה נמחק!
                    yossizY תגובה 1 תגובה אחרונה
                    0
                    • אבי 203א אבי 203

                      פוסט זה נמחק!

                      yossizY מנותק
                      yossizY מנותק
                      yossiz
                      כתב ב נערך לאחרונה על ידי
                      #14

                      @אבי-203 אמר בלולאה שנתקעת ומדלגת פריטים:

                      @yossiz לא עובד טוב
                      מה יכול להיות???

                      לא תיארת מה לא עובד. נראה לי שבשלב הזה יהיה קשה לעזור מעל גבי דפי הפורום.

                      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                      תגובה 1 תגובה אחרונה
                      1
                      תגובה
                      • תגובה כנושא
                      התחברו כדי לפרסם תגובה
                      • מהישן לחדש
                      • מהחדש לישן
                      • הכי הרבה הצבעות


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

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

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