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

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

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. Promise.all + filter

Promise.all + filter

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

    נתון מערך של פרומיסים. (כאן זה פרומיסים מדומה, אבל זה יכול להיות fetch או קריאה לdb וכדומה) אני מעוניין לפלטר אותו עם פונקציית filter, ולהמתין לסים הפרומיסים + הפילטור.

    function promiseOk() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(true);
            }, 1);
        });
    }
    
    function promiseFailed() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(false);
            }, 1);
        });
    }
    
    const promisesList = [
        promiseFailed(),
        promiseOk(),
        promiseFailed(),
        promiseOk()
    ]; // [Promise, Promise, Promise, Promise]
    
    const promisesStack = promisesList.filter(async (promise) => {
        const res = await promise;
        return res
    }); // [Promise, Promise, Promise, Promise]
    
    (async () => {
        const results = await Promise.all(promisesStack);
        console.log(results); // [false, true, false, true]
    })()
    

    כפי שציינתי בהערות בקוד, אני מעביר מערך של פרומיסים (מערך של פונקציות async) אל Promise.all, שאליו אני ממתין עם await,
    אך התוצאה היא מערך של 4 תוצאות, במקום 2 בלבד, כלומר גם הפרומיסים שמחזירים false עדיין נכללים - היינו שהפילטר לא פועל.
    לעומת זאת כאשר אני ממתין למערך הפרומיסים, ורק אז מפלטר אותו, הוא מפולטר בהצלחה:

    (async () => {
        const results = await Promise.all(promisesList);
        console.log(results.filter((res) => res)); // [true, true]
    })()
    

    תודה מראש.

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

    dovidD תגובה 1 תגובה אחרונה
    0
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      השיב לצדיק תמים ב נערך לאחרונה על ידי dovid
      #2

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

      [true, false].filter(x => x);
      

      אם אתה מסמן את הפונקציה כasync וכותב בה await, בעצם מה שחוזר הוא תמיד תמיד פרומייס:

      typeof (x => Promise.resolve(x))() == 'object'; //true
      typeof (async x => await Promise.resolve(x))() == 'object'; //true
      

      כלומר התוצאה תמיד חיובית.
      אתה מצפה שfilter יפעיל await על התוצאה, אבל הוא לא.

      ראה גם https://stackoverflow.com/q/33355528/1271037

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

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

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

        דבר נוסף - בשורה 25 שכחת לקרוא לפרומיס

        var res = await promise();
        

        גם מה שאתה עושה פה מאבד את כל הרעיון של Promise.all, בגלל שכבר קראת לכל הפרומיסים בfilter וקיבלת את התוצאות שלהם.

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

          @חגי הוא לא שכח, את הקריאה הוא עשה ישירות בהצבה במערך.
          הערך של promise כעת אינו פונקציה אלא אובייקט.

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

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

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

            @dovid מעניין, כי map כן מתמודד בהצלחה עם פונקציה אסינכרונית:

            function promiseOk() {
                return new Promise((resolve, reject) => {
                    setTimeout(() => {
                        resolve(true);
                    }, 1);
                });
            }
             
            function promiseFailed() {
                return new Promise((resolve, reject) => {
                    setTimeout(() => {
                        resolve(false);
                    }, 1);
                });
            }
             
            const promisesList = [
                promiseFailed(),
                promiseOk(),
                promiseFailed(),
                promiseOk()
            ]; // [Promise, Promise, Promise, Promise]
             
            const promisesStack = promisesList.map(async (promise) => {
                const res = await promise;
                return res + '4'
            }); // [Promise, Promise, Promise, Promise]
            
            (async () => {
                const results = await Promise.all(promisesStack);
                console.log(results); // ['false4', 'true4', 'false4', 'true4']
            })()
            

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

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

            yossizY תגובה 1 תגובה אחרונה
            0
            • yossizY מנותק
              yossizY מנותק
              yossiz
              השיב לצדיק תמים ב נערך לאחרונה על ידי yossiz
              #6

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

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

              תגובה 1 תגובה אחרונה
              6
              • י מנותק
                י מנותק
                יוסף בן שמעון
                כתב ב נערך לאחרונה על ידי
                #7
                פוסט זה נמחק!
                תגובה 1 תגובה אחרונה
                0

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

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

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