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

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

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

פעולה סינכרונית nodejs

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

    יש לי פונקציה של בדיקה מול השרת של ימות המשיח באמצעות FTP האם קיימים למחר הקבצים הנדרשים, וזה נשלח למייל לעדכן האם חסר משהו.
    הבעיה היא שלא הסתדרתי לעשות את זה בצורה נכונה, אלא עשיתי קומבינה שהפונקציה רצה לעצמה ורק אחרי עשר שניות היא מודפסת למסך ונשלחת למייל.
    הבעיה היא למשל כאשר השרת של ימות המשיח עובד לאט או כל סיבה אחרת שלקח זמן לפעולת הבדיקה להתבצע, התוצאה נשלחת למייל רק חלקית.
    איך אני אמור לבנות נכון את הפונקציה? (הפונקציה מופעלת ע"י תזמון קבוע ו/או ע"י בקשה ע"י הדפדפן או הטלפון.)
    הבדיקה מבוצעת היא כך:
    א. בדיקה שקיים הקלטה של תוכנית הלימוד היומי.
    ב. לולאה שעוברת על המערך של המסלולים הפעילים, ובודקת במערך של השאלות והתשובות (שמתעדכן מתוך הד"ב ע"י תזמון כל כמה דקות) האם השאלות והתשובות קיימים בכל מסלול, ומכניסה אותם למחרוזת.
    ג. לולאה שעוברת על כל המסלולים הפעילים, ובכל מסלול בודקת ע"י פרומיז-FTP (שהתקנתי מ NPM) שזה קיים בימות המשיח, וא"כ בודקת האם קיימים 13 קבצים (3 שאלות + 9 תשובות + כותרת הלימוד של מסלול זה), אם קיימים כל הקבצים, זה מחזיר שהכל קיים, אם ריק, מחזיר שריק, ואם חלק, זה מחזיר מה כן ומה לא.
    להלן מבנה הפונקציה הקיימת:
    (אם משהו לא ברור ניתן לשאול אותי, כמו"כ כל הערה מחכימה על בניית הקוד נכון יותר תתקבל בברכה, מכל מלמדי השכלתי, (כאשר לא לומדים את המקצוע במכון לימודים, צריך ללמוד מכל מקום אחר אפשרי..)
    סליחה על אריכות הקוד, אבל אני מרגיש שאכן חסר לי את האסימון והמידע הנכון לגבי איך לבנות נכון פעולות סינכרוניות.
    ואציין שניסיתי לעשות for עם פרומיז שיבצע לי את הבדיקה ורק לאחריו שישלח את המייל, מה ראיתי הוא שהלולאה מבוצעת מיידית בשלמותה, והיא מחריזה מערך עם איברים ריקים, ואח"כ היא מתמלאת, כי מה שקורה בפרומיז שהוא לא ממתין שהפעולות יבוצעו בצורה סינכרונית, אלא הוא קורא לפעולות בצורה סיכרונית, אבל ממשיך הלאה כאשר הפעולות עצמם מבוצעות א-סינכרוני.

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

    var PromiseFtp = require('promise-ftp');
    var dateTimeFormatter = require('date_time_formatter');
    var str_tu_mail;
    var strs_tu_mail;
    var missing_q_tu_mail;
    var missing_ym_tu_mail;
    var koteret_tu_mail;
    var koteret_checkink_mail;
    var Hebcal = require('hebcal');
    var in_array = require('in_array');
    
    function cron_checking_files(day){
        var ftp = new PromiseFtp();
        let maslulim_to_mail = [], questions_and_answers_to_mail = [], files_in_ym = [];
        let day_checking = day;
        strs_tu_mail ={};
        missing_q_tu_mail ={};
        missing_ym_tu_mail ={};
        koteret_tu_mail = {};
        koteret_checkink_mail = '';
        //day_checking.setDate(day_checking.getDate() + 1);
        let day_format = dateTimeFormatter.formatDate(day_checking, "yyyymmdd");
        //console.log(day_format);
        str_tu_mail = 'תאריך: ' + get_he_full_date(dateTimeFormatter.formatDate(day_checking, "yyyy-mm-dd")) + ' ' + dateTimeFormatter.formatDate(day_checking, "yyyy-mm-dd") +  ".<br>";
        let HDate = new Hebcal.HDate(day_checking);
        let Month_arr = {
            1 : '8',
            2 : '9',
            3 : '10',
            4 : '11',
            5 : '12',
            6 : '13',
            7 : '1',
            8 : '2',
            9 : '3',
            10 : '4',
            11 : '5',
            12 : HDate.isLeapYear === true ? '6' : '7',
            13 : HDate.isLeapYear === true ? '7' : '',
            }
        ;
        ftp.connect({host: '31.168.172.22', user: 'user', password: 'pass'})
            .then(function (serverMessage) {
                ftp.list('/limudklali/' + HDate.getFullYear() + '/' + Month_arr[HDate.getMonth()] + '/' ).then(function (file) {
                    let file_arr = array_column(file, 'name');
                    if (in_array(day_format + '.wav', file_arr)){
                        koteret_checkink_mail = '<h4 style="color: #804b75">' + 'קובץ כותרת מסלולי הלימוד היומי קיים' + ".</h4>";
                    } else {
                        koteret_checkink_mail = '<h4 style="color: #803808">' + 'קובץ כותרת מסלולי הלימוד היומי אינו קיים' + ".</h4>";
                    }
                });
                //console.log('Server message: '+serverMessage);
                for (let maslul_key in maslulim[day_format]){
                    let maslul = maslulim[day_format][maslul_key];
                    if (!strs_tu_mail[maslul.id]){
                        strs_tu_mail[maslul.id] = '';
                    }
                    //console.log(maslul);
                    let phte = '/assets/qr/' + maslul.id + '/' + day_format + '/';
                    ftp.list(phte ).then(function (files) {
                        //console.log(phte);
                        //console.log(files);
                        let files_arr = array_column(files, 'name');
                        strs_tu_mail[maslul.id] += '<h2>' + 'מסלול: ' + '<span style="color:#5c34cd" >' + maslul.name_he + '</span>' +', מספר המסלול: ' + maslul.id + ".</h2>";
                        strs_tu_mail[maslul.id] += '<h3>' + 'נתונים בטבלאות: ' + ".</h3>";
                        if (!questions_and_answers_arr[day_format] || !questions_and_answers_arr[day_format][maslul_key] || questions_and_answers_arr[day_format][maslul_key] == null){
                            strs_tu_mail[maslul.id] += '<h4>' + 'לא קיים שום נתון' + ".</h4>";
                            missing_q_tu_mail[maslul.id] = '';
                            if (maslul.Outside === 1 || maslul.Outside === 2 ) {
                                koteret_tu_mail[maslul.id] = 'חסר בטבלה';
                            }
                        } else {
                            strs_tu_mail[maslul.id] += 'כותרת הלימוד: ' +  questions_and_answers_arr[day_format][maslul_key][1].limud_yomi  + ".<br>" ;
                            if (maslul.Outside === 1 || maslul.Outside === 2) {
                                koteret_tu_mail[maslul.id] = questions_and_answers_arr[day_format][maslul_key][1].limud_yomi;
                            }
                            let num_file = {
                                '1' : '1',
                                '11' : '2',
                                '12' : '3',
                                '13' : '4',
                                '2' : '5',
                                '21' : '6',
                                '22' : '7',
                                '23' : '8',
                                '3' : '9',
                                '31' : '10',
                                '32' : '11',
                                '33' : '12',
                                '0' : '13',
                            };
                            for (let i = 1; i <= 3; i++) {
                                if (!questions_and_answers_arr[day_format][maslul_key][i]){
                                    missing_q_tu_mail[maslul.id] = '';
                                }
                                strs_tu_mail[maslul.id] += '<br>' + num_file[i] + ' ' + `שאלה ${i}: ` + (questions_and_answers_arr[day_format][maslul_key][i].q) + ".<br>";
                                for (let i2 = 1; i2 <= 3; i2++) {
                                    strs_tu_mail[maslul.id] += (num_file['' + i + i2] + ' ') + `שאלה ${i} תשובה ${i2}: ` + (questions_and_answers_arr[day_format][maslul_key][i]['r' + i2]) + ".<br>";
                                }
                                strs_tu_mail[maslul.id] += `התשובה הנכונה לשאלה ${i}: ` + (questions_and_answers_arr[day_format][maslul_key][i].QValid) + ".<br>";
                            }
                        }
                        strs_tu_mail[maslul.id] += '<h3>' + 'קבצים במערכת הטלפונית: ' + "</h3>";
                        //console.log(files_arr);
                        if (files_arr.length === 0) {
                            strs_tu_mail[maslul.id] += '<h4 style="color: red">' + 'לא קיים שום קובץ' + ".</h4>";
                            missing_ym_tu_mail[maslul.id] = '';
                        } else if (files_arr.length === 13){
                            strs_tu_mail[maslul.id] += '<h4 style="color: green">' + 'כל הקבצים קיימים' + ".</h4>";
                        }else {
                            if (in_array('p.wav', files_arr)) {
                                strs_tu_mail[maslul.id] += 'כותרת הלימוד: ' + 'קיים'  + ".<br>";
                            } else {
                                strs_tu_mail[maslul.id] += 'כותרת הלימוד: ' + 'לא קיים'  + ".<br>";
                                missing_ym_tu_mail[maslul.id] = '';
                            }
                            for (let i = 1; i <= 3; i++) {
                                if (in_array('q' + i + '.wav', files_arr)) {
                                    strs_tu_mail[maslul.id] += `שאלה ${i}: ` + 'קיים' + ".<br>";
                                } else {
                                    strs_tu_mail[maslul.id] += `שאלה ${i}: ` + 'לא קיים' + ".<br>";
                                    missing_ym_tu_mail[maslul.id] = '';
                                }
                                for (let i2 = 1; i2 <= 3; i2++) {
                                    if (in_array('q' + i + 'r' + i2 + '.wav', files_arr)) {
                                        strs_tu_mail[maslul.id] += `שאלה ${i} תשובה ${i2}: ` + 'קיים' + ".<br>";
                                    } else {
                                        strs_tu_mail[maslul.id] += `שאלה ${i} תשובה ${i2}: ` + 'לא קיים' + ".<br>";
                                        missing_ym_tu_mail[maslul.id] = '';
                                    }
                                }
                            }
                        }
                        strs_tu_mail[maslul.id] += '</p>';
                        //console.log(str_tu_mail);
                    });
                }
                return strs_tu_mail;
            }).then(function (strs_tu_mail) {
            //console.log('Directory listing:');
            //console.log(strs_tu_mail);
            //console.dir(list);
            ftp.end();
            return str_tu_mail;
        });
    }
    function array_column(arr, column) {
        return arr.map(x => x[column])
    }
    var j = schedule.scheduleJob('51 07 * * 0-5', function(){
        let my_date = new Date();
        if (dateTimeFormatter.formatDate(my_date, "HHMM") > '0459'){
            my_date.setDate(my_date.getDate() + 1);
        }
        var to_mail;
    
        to_mail = '<mail@gmail.com> ישיבה על קברו';
    
        //res.setHeader('Content-Type', 'application/json; charset=utf-8');
        cron_checking_files(my_date);
        let str_first = '<HTML lang="he-IL"><body dir="rtl">';
        let str_end = '</body></HTML>';
        //let str = '';
        setTimeout(function () {
            //console.log(strs_tu_mail);
            var str = str_first + str_tu_mail;
            let w_db = '';
            let str_db = '';
            if (Object.keys(missing_q_tu_mail).length > 0){
                w_db += ' חסרים שאלות בטבלאות.';
                str_db += '<p>' + 'מסלולים שחסר בהם שאלות בטבלאות: ';
                for (let db_s in missing_q_tu_mail){
                    str_db += maslulim_ids[dateTimeFormatter.formatDate(my_date, "yyyymmdd")][db_s].name_he + ', ' ;
                }
                str_db += '</p>';
            }
            let w_ym = '';
            let str_ym = '';
            if (Object.keys(missing_ym_tu_mail).length > 0){
                w_ym += ' חסרים קבצים בטלפון.';
                str_ym += '<p>' + 'מסלולים שחסר בהם קבצים: ';
                for (let ym_s in missing_ym_tu_mail){
                    str_ym += maslulim_ids[dateTimeFormatter.formatDate(my_date, "yyyymmdd")][ym_s].name_he + ', ';
                }
                str_ym += '</p>';
            }
            str += str_db + str_ym;
            if (Object.keys(koteret_tu_mail).length > 0){
                str += '<p> כותרות הלימוד: ';
                for (let koteret_key in koteret_tu_mail){
                    str += '<br>' + maslulim_ids[dateTimeFormatter.formatDate(my_date, "yyyymmdd")][koteret_key].name_he + ': ' + koteret_tu_mail[koteret_key];
                }
                str += '</p>';
            }
    
            str += koteret_checkink_mail;
            for (let str_i in strs_tu_mail){
                str += strs_tu_mail[str_i];
            }
            str += str_end;
            //res.send(str);
            mailOptions = {
                from: 'רישומון - להתקשר חכם <7226644@gmail.com‏>',
                to: to_mail,
                subject: 'בדיקת מצב ההקלטות ל' + get_he_full_date(dateTimeFormatter.formatDate(my_date, "yyyy-mm-dd")) + w_ym + w_db,
                html: str,
                //attachments : attachments,
            };
            transporter.sendMail(mailOptions, function (error, info) {
                if (error) {
                    console.log(error);
                } else {
                    console.log('Email sent: ' + info.response);
                }
            });
        }, 10000);
    });
    
    
    yossizY תגובה 1 תגובה אחרונה
    0
    • yossizY מנותק
      yossizY מנותק
      yossiz
      השיב לחוקר ב נערך לאחרונה על ידי yossiz
      #2

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

      עוד לא קראתי את הכל בעיון, אבל מיד אני רואה שה-then בשורה 44 לא אמור להיות מקונן בתוך הפונקציה, אלא משורשר, כי בדרך שאתה עושה, אתה מחזיר ערך לפני שהפרומייז ש-ftp.list מחזיר נהיה resolved. תחליף את שורה 42-44 לזה:

          ftp.connect({host: '31.168.172.22', user: 'user', password: 'pass'})
              .then(()=> ftp.list('/limudklali/' + HDate.getFullYear() + '/' + Month_arr[HDate.getMonth()] + '/' ))
              .then(function (file) {
          ....
      

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

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

        @yossiz אמר בפעולה סינכרונית nodejs:

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

        עוד לא קראתי את הכל בעיון, אבל מיד אני רואה שה-then בשורה 44 לא אמור להיות מקונן בתוך הפונקציה, אלא משורשר, כי בדרך שאתה עושה, אתה מחזיר ערך לפני שהפרומייז ש-ftp.list מחזיר נהיה resolved. תחליף את שורה 42-44 לזה:

            ftp.connect({host: '31.168.172.22', user: 'user', password: 'pass'})
                .then(()=> ftp.list('/limudklali/' + HDate.getFullYear() + '/' + Month_arr[HDate.getMonth()] + '/' ))
                .then(function (file) {
            ....
        

        אשמח לקצת יותר הסבר, כי אני לא הצלחתי לרדת לעומק הנושא של פורמיז.
        הרי חוץ מהבדיקה הראשונה בשורה 44 יש לי את כל שאר הלולאה של הבדיקה בהמשך.
        עלי לעשות כעת כל שלב ב then מה ftp.connect הראשון?
        וכן אשמח להבין מדוע אם זה בתוך פונצקיה זה יחזיר מיד ערך, משא"כ אם זה לא בתוך פונקציה?
        תודה

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

          סליחה לא הייתי מספיק ברור

          @חוקר אמר בפעולה סינכרונית nodejs:

          עלי לעשות כעת כל שלב ב then מה ftp.connect הראשון?

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

          מה שאתה עשית, זה שמיד שהפרומיס הראשון נפתר (ז"א, יש חיבור FTP - בתוך ה-then שלו - ) ייצרת אומנם פרומיס שני (ftp.list), והדבקת ל-then של הפרומיס - קוד שיעבד את הנתונים ושיאכלס את אובייקט strs_tu_mail, אבל מיד עברת לשורה הבאה שמחזיר strs_tu_mail לפני שהוא מאוכלס עם הנתונים.

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

          function doStuff(data) {
              process(data);
              mail(data);
          }
          
          ftp.connect(args).then(()=>
              ftp.list(args)
          ).then(
              doStuff
          )
          

          במקום:

          ftp.connect(args).then(
              ()=>ftp.list(args).then(
                  doStuff;
              )
          )
          

          שתי הדרכים הנ"ל אותו דבר, אבל מה שאתה עשית הוא:

          var result = {};
          
          ftp.connect(args).then(()=> {
              ftp.list(args).then((data)=>
                  process(data, result);
              })
          )).then(
              email(result/*!!data isn't yet processed!!*/);
          )
          

          מקווה שזה עוזר...
          (רואים שאין לי מושג איך מקובל לפרמט קוד כזה, הא? 🙂 )

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

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

            @yossiz אמר בפעולה סינכרונית nodejs:

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

            יש גם הבדל בין שתי הדרכים אם כותבים catch בסוף, שכאשר מקוננים זה יתפוס רק שגיאות של הפרומיס הראשון, אבל אם משרשרים זה יתפוס כל השגיאות בשרשרת.

            https://www.datchley.name/promise-patterns-anti-patterns/

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

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

              @yossiz אמר בפעולה סינכרונית nodejs:

              ftp.connect(args).then(()=>
              ftp.list(args).then((data)=>
              process(data);
              )
              )).then(
              email(/!!data isn't yet processed!!/);
              )

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

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

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

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

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

                @dovid נכון, תיקנתי.
                דרך אגב, מבטאים את זה פרומיס, לא פרומייז.

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

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

                  למעשה מה שלא הצלחתי להבין.
                  אני צריך לעשות לולאה של בדיקות ע"י FTP (אדרבה שכל הבדיקה תבוצע בבת אחת), ומצד שני בגמר הרצת הלולאה יבוצע העיבוד והשליחה למייל.
                  לא כ"כ נראה לי ישים לעשות לולאה שיוצרת thenים מה ftp.connect הראשון.
                  או אולי יש כן איזה דרך, וא"כ זה נראה לי הכי פשוט, אך עדיין לא מושלם כי אז תבוצע כל בדיקה בלולאה בנפרד, וחבל על הזמן.
                  א"כ אני כן צריך משהו שמריץ הכל ביחד ובסיום אני מקבל את הנתונים.
                  אולי בעצם ניתן לעשות זאת עם Promise​.all()?
                  תודה

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

                    @חוקר
                    חוששני שאתה לא בקטע כעת של "להבין" אלא בקטע של "להצליח", אני טועה?
                    הסיבה שלא כדאי לעשות thenים בלולאה היא כיון שזה בזבוז זמן: אתה לא צריך שכל בדיקה תחכה לאחת, מה אכפת לך שהם יבוצעו במקביל? מה שחשוב לך זה לדעת מתי נגמרו כל הבדיקות ומה התוצאות שלהם. Promise.all/Promise.race הם בדיוק בשביל זה.

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

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

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

                      @dovid אמר בפעולה סינכרונית nodejs:

                      @חוקר
                      חוששני שאתה לא בקטע כעת של "להבין" אלא בקטע של "להצליח", אני טועה?
                      הסיבה שלא כדאי לעשות thenים בלולאה היא כיון שזה בזבוז זמן: אתה לא צריך שכל בדיקה תחכה לאחת, מה אכפת לך שהם יבוצעו במקביל? מה שחשוב לך זה לדעת מתי נגמרו כל הבדיקות ומה התוצאות שלהם. Promise.all/Promise.race הם בדיוק בשביל זה.

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

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

                        ייתכן שאני על הכיון הנכון.
                        הקוד הזה עבד לי טוב

                                    var promises = [];
                                    for (let i =0;i<3;i++) {
                                        console.log('files'+i);
                                        promises.push(ftp.list('/limudklali/' + HDate.getFullYear() + '/' + Month_arr[HDate.getMonth()] + '/'));
                                    }
                                    Promise.all(promises).then(function(values) {
                                        ftp.end();
                                        console.log(values);
                                    });
                        

                        והפלט היה:

                        files0
                        files1
                        files2
                        [ [ { type: '-',
                              name: '20190506.wav',
                              target: undefined,
                              sticky: false,
                              rights: [Object],
                              acl: false,
                              owner: 'ftp',
                              group: 'ftp',
                              size: 680204,
                              date: 2019-05-05T21:08:00.000Z },
                            { type: '-',
                              name: '20190507.wav',
                              target: undefined,
                              sticky: false,
                              rights: [Object],
                              acl: false,
                              owner: 'ftp',
                              group: 'ftp',
                              size: 749004,
                              date: 2019-05-07T05:17:00.000Z }],
                        [ { type: '-',
                              name: '20190506.wav',
                              target: undefined,
                              sticky: false,
                              rights: [Object],
                              acl: false,
                              owner: 'ftp',
                              group: 'ftp',
                              size: 680204,
                              date: 2019-05-05T21:08:00.000Z },
                            { type: '-',
                              name: '20190507.wav',
                              target: undefined,
                              sticky: false,
                              rights: [Object],
                              acl: false,
                              owner: 'ftp',
                              group: 'ftp',
                              size: 749004,
                              date: 2019-05-07T05:17:00.000Z }],
                        [ { type: '-',
                              name: '20190506.wav',
                              target: undefined,
                              sticky: false,
                              rights: [Object],
                              acl: false,
                              owner: 'ftp',
                              group: 'ftp',
                              size: 680204,
                              date: 2019-05-05T21:08:00.000Z },
                            { type: '-',
                              name: '20190507.wav',
                              target: undefined,
                              sticky: false,
                              rights: [Object],
                              acl: false,
                              owner: 'ftp',
                              group: 'ftp',
                              size: 749004,
                              date: 2019-05-07T05:17:00.000Z }]]
                        

                        שזה אומר שמצד אחד הלולאה רצה מיידית על הכל, ומצד שני רק בסיום הלולאה יש לי את התוצאות.
                        השאלה היא א"כ מה הכי פרקטי שמצד אחד יש לי את הנתונים לביצוע העיבוד, ומצד שני יש לי מערך של כל הפרומיסים עבור ה Promise.all.
                        האם יש משהו בJS הצבת משתנה ששמו דינאמי, כמו בPHP למשל:

                        ${'num' . $i} = $ftp->list('/limudklali/' + HDate.getFullYear() + '/' + Month_arr[HDate.getMonth()] + '/');
                        print ${'num' . $i};
                        

                        בהדפסת משתנה בתוך מחרוזת ראיתי שזה קיים גם בJS

                        res.end(` my num is: ${'num' + i},  good by`);
                        

                        אבל לא הצלחתי לעשות הצבת משתנה בסגנון זה.
                        תודה

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

                          מדוע sum מוקף במרכאות?

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

                            @חוקר אמר בפעולה סינכרונית nodejs:

                            השאלה היא א"כ מה הכי פרקטי שמצד אחד יש לי את הנתונים לביצוע העיבוד, ומצד שני יש לי מערך של כל הפרומיסים עבור ה Promise.all.
                            האם יש משהו בJS הצבת משתנה ששמו דינאמי, כמו בPHP למשל:

                            לא הבנתי את המשפטים והקשר ביניהם.

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

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

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

                              @אהרן אמר בפעולה סינכרונית nodejs:

                              מדוע sum מוקף במרכאות?

                              כשאני רוצה להגיע לתוצאה של פלט "num1" אני חייב לכתוב

                               'num' + i
                              

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

                              num + i
                              

                              זה יחפש משתנה בשם num ומשתנה בשם i

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

                                @dovid אמר בפעולה סינכרונית nodejs:

                                @חוקר אמר בפעולה סינכרונית nodejs:

                                השאלה היא א"כ מה הכי פרקטי שמצד אחד יש לי את הנתונים לביצוע העיבוד, ומצד שני יש לי מערך של כל הפרומיסים עבור ה Promise.all.
                                האם יש משהו בJS הצבת משתנה ששמו דינאמי, כמו בPHP למשל:

                                לא הבנתי את המשפטים והקשר ביניהם.

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

                                'num' + i
                                

                                ובמקביל ליצור מערך שדוחפים אליו את השמות הדינאמים.
                                ואז להעביר לPromise.all את המערך של שמות המשתנים שעליו להמתין עד שיגמרו את פעילותם.

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

                                  זה גם הלך לי.
                                  האם יש רעיון יותר טוב

                                              var promises = [];
                                              for (let i =0;i<3;i++) {
                                                  console.log('files'+i);
                                                  global['files'+i] = (ftp.list('/limudklali/' + HDate.getFullYear() + '/' + Month_arr[HDate.getMonth()] + '/'));
                                                  promises.push(global['files'+i]);
                                              }
                                              Promise.all(promises).then(function(values) {
                                                  ftp.end();
                                                  console.log(values);
                                              });
                                  

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

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

                                    @חוקר מה באת להרויח כאן?
                                    בשני המקרים אתה מחזיק מערך של כל הפרומיסים, ואז קורא לו בפונקציה promise.all.
                                    אלא שעכשיו גם הוספת את זה למערך גלובאלי נוסף.. בשביל מה?

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

                                      @avr416 אמר בפעולה סינכרונית nodejs:

                                      @חוקר מה באת להרויח כאן?
                                      בשני המקרים אתה מחזיק מערך של כל הפרומיסים, ואז קורא לו בפונקציה promise.all.
                                      אלא שעכשיו גם הוספת את זה למערך גלובאלי נוסף.. בשביל מה?

                                      כדי שיהיה לי גישה אח"כ לעיבוד הנתונים.
                                      אני צריך אפשרות לעבד כל אחת מהתוצאות.
                                      את העיבוד אני יעשה בתוך ה promise.all.
                                      בראשון הכל נכנס לתוך מערך בלי שיהיה לי את השם של התוצאה ואז אין לי איך לעבד את התוצאה לכל אחד, לדעת של מי כל תוצאה.

                                      A תגובה 1 תגובה אחרונה
                                      0
                                      • A מנותק
                                        A מנותק
                                        avr416
                                        השיב לחוקר ב נערך לאחרונה על ידי
                                        #19

                                        @חוקר
                                        אם global הוא אובייקט, אתה יכול להמיר אותו למערך ולהעביר אותו ישירות לפרומיס.all וא"צ ליצור עוד מערך של פרומיסס.

                                        Promise.all(Object.keys(global).map(k=>global[k]))
                                        

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

                                        ח A 2 תגובות תגובה אחרונה
                                        1
                                        • ח מנותק
                                          ח מנותק
                                          חוקר
                                          השיב לavr416 ב נערך לאחרונה על ידי
                                          #20

                                          @avr416
                                          גלובל הוא הפיתרון למה ששאלתי כאן למעלה https://tchumim.com/post/61118
                                          הוא מערך של כל המשתנים vars בסקופ.
                                          אבל אכן חזרתי בי מהצורך להשים אותם כמשתנה גלובאלי, אלא ליצור אובייקט נפרד לקבלת התוצאות, ואז ליצור משהו בסגנון שציינת עבור ה Promise.all

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

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

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

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