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

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

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

עזרה לקוד אסינכרוני בnodejs

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

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

    if (isAir != false) {
        var message = '';
    
        if (isAir.length > 1) {
            message = `יש לכם ${isAir.length} אסימונים פעילים לחצו על 1 להשמעה חוזרת ו 2 ליציאה`;
        } else if (isAir.length === 1) {
            message = 'יש לכם אסימון אחד לחצו על 1 להשמעה חוזרת ו 2 ליציאה';
        } else {
            console.log('No matching rows found');
        }
        console.log('message', message);
    
    
        const choiceAction = await call.read([{
            type: 'text',
            data: message
        }], 'tap', {
            max_digits: 1,
            digits_allowed: [1, 2],
            allow_empty: false,
            sec_wait: 8
        });
    
        console.log('choiceAction', choiceAction);
    }
    

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

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

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

      @מוטי-מן זה לא קשור לאסינכרוניות, סתם קוד (לדוגמה התנאי שכאן) רץ סינכרונית
      יש מצב שisAir.length הוא 0, ולכן זה מגיע לאופציה השלישית שבה אין שינוי של הmessage והוא נשאר סטרינג ריק?
      אגב, כדאי להביא גם את הפלט (מה שמודפס לקנוסול)

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

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

        @צדיק-תמים זהו, שהפלט של console.log('message', message); הוא "יש לכם 3 אסימונים פעילים לחצו על 1 להשמעה חוזרת ו 2 ליציאה",

        זה רץ בתוך פונקציה async

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

          @מוטי-מן כתב בעזרה לקוד אסינכרוני בnodejs:

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

          if (isAir != false) {
              var message = '';
          
              if (isAir.length > 1) {
                  message = `יש לכם ${isAir.length} אסימונים פעילים לחצו על 1 להשמעה חוזרת ו 2 ליציאה`;
              } else if (isAir.length === 1) {
                  message = 'יש לכם אסימון אחד לחצו על 1 להשמעה חוזרת ו 2 ליציאה';
              } else {
                  console.log('No matching rows found');
              }
              console.log('message', message);
          
          
              const choiceAction = await call.read([{
                  type: 'text',
                  data: message
              }], 'tap', {
                  max_digits: 1,
                  digits_allowed: [1, 2],
                  allow_empty: false,
                  sec_wait: 8
              });
          
              console.log('choiceAction', choiceAction);
          }
          

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

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

          מה כתוב בלוג api של ימות המשיח?
          שמה הם קיבלו ממך, איזה תשובה?

          כיף לגלות דברים חדשים.
          חוק ה-50-50-90: בכל פעם שיש סיכוי של 50-50 שמשהו יעבוד, יש סיכוי של 90 אחוז שהוא לא. מקור

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

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

            async function callHandler (call) {
                const isAir = [null, null, null];
                if (isAir !== false) {
                    let message = '';
            
                    if (isAir.length > 1) {
                        message = `יש לכם ${isAir.length} אסימונים פעילים לחצו על 1 להשמעה חוזרת ו 2 ליציאה`;
                    } else if (isAir.length === 1) {
                        message = 'יש לכם אסימון אחד לחצו על 1 להשמעה חוזרת ו 2 ליציאה';
                    } else {
                        console.log('No matching rows found');
                    }
                    console.log('message', message);
            
                    const choiceAction = await call.read([{
                        type: 'text',
                        data: message
                    }], 'tap', {
                        max_digits: 1,
                        digits_allowed: [1, 2],
                        allow_empty: false,
                        sec_wait: 8
                    });
            
                    console.log('choiceAction', choiceAction);
                }
            };
            

            וזה משמיע תקין את ההודעה יש לכם 3 אסימונים וכו'.
            אני מציע ש:

            1. תביא את הקוד המלא (את כל הפונקציה)
            2. תוודא שאתה משתמש בגרסה האחרונה של ספריית yemot-router2, נכון להיום זה 6.1.6 (אתה יכול לראות את הגרסה שמותקנת בקובץ package.json)

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

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

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

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

              זה הפונקציה המלאה

              async function callHandler(call) {
              
                  const isAir = await getAir(call);
              
                  console.log('isAir', isAir.join('\n'));
              
                  if (isAir != false) {
                      var message = '';
              
                      if (isAir.length > 1) {
                          const messages = isAir.map(row => `אסימון מסוג ${row.type} בשווי ${row.value}`).join(' וכן את ');
                          message = `יש לכם ${isAir.length} אסימונים פעילים ${messages}`;
                      } else if (isAir.length === 1) {
                          const row = isAir[0];
                          message = `יש לכם אסימון אחד פעיל מסוג ${row.type} בשווי ${row.value}`;
                      } else {
                          console.log('No matching rows found');
                      }
                      console.log('message', message);
              
              
                      const choiceAction = await call.read([{
                          type: 'text',
                          data: message + `למימוש הקישו 1 להמשך הפעילות הקישו 2`
                      }], 'tap', {
                          max_digits: 1,
                          digits_allowed: [1, 2],
                          allow_empty: false,
                          sec_wait: 12
                      });
              
                      console.log('choiceAction', choiceAction);
              
                      if (choiceAction == 1) {
                          call.id_list_message([{
                              type: 'text',
                              data: `אפשרות זו עדיין לא פעילה`
                          }]);
              
                      } else if (choiceAction == 2) {
                          handlerReceive(call);
                      }
                  } else {
                      handlerReceive(call);
                  }
              }
              
              צדיק תמיםצ תגובה 1 תגובה אחרונה
              0
              • צדיק תמיםצ מנותק
                צדיק תמיםצ מנותק
                צדיק תמים
                השיב למוטי מן ב נערך לאחרונה על ידי צדיק תמים
                #7

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

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

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

                  @צדיק-תמים קודם כל תודה על העזרה!

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

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

                  אני מקווה שכעת זה מספיק,כי אני לא באמת יודע מה להביא כי כבר getAir עצמה נראית בסדר במחשב, ורק בטלפון זה לא מושמע

                  async function callHandler(call) {
                   
                      const isAir = await getAir(call);
                   
                      console.log('isAir', isAir.join('\n'));
                   
                      if (isAir != false) {
                          var message = '';
                   
                          if (isAir.length > 1) {
                              const messages = isAir.map(row => `אסימון מסוג ${row.type} בשווי ${row.value}`).join(' וכן את ');
                              message = `יש לכם ${isAir.length} אסימונים פעילים ${messages}`;
                          } else if (isAir.length === 1) {
                              const row = isAir[0];
                              message = `יש לכם אסימון אחד פעיל מסוג ${row.type} בשווי ${row.value}`;
                          } else {
                              console.log('No matching rows found');
                          }
                          console.log('message', message);
                   
                   
                          const choiceAction = await call.read([{
                              type: 'text',
                              data: message + `למימוש הקישו 1 להמשך הפעילות הקישו 2`
                          }], 'tap', {
                              max_digits: 1,
                              digits_allowed: [1, 2],
                              allow_empty: false,
                              sec_wait: 12
                          });
                   
                          console.log('choiceAction', choiceAction);
                   
                          if (choiceAction == 1) {
                              call.id_list_message([{
                                  type: 'text',
                                  data: `אפשרות זו עדיין לא פעילה`
                              }]);
                   
                          } else if (choiceAction == 2) {
                              handlerReceive(call);
                          }
                      } else {
                          handlerReceive(call);
                      }
                  }
                  
                  
                  async function getAir(call) {
                      const user = "079555555";
                      //let apiEnterID = call?.ApiEnterID || "";
                      //let [apiEnterIDType, apiEnterIDValue] = apiEnterID !== "" ? apiEnterID.split('-') : ["ללא", call.ApiPhone];
                      let apiEnterIDValue = '0559777777';
                  
                      try {
                          //const filePath = `${user}/air.ini`;
                          //const fileContent = await fs.readFileSync(filePath, 'utf-8');
                          const fileContent = `afhnrcl4b4r24k9,0559777777,0559777777,יוסי,12,זהב,1,רגיל,1
                          7bun3eqdznlpk86,0559777777,0559777777,יוסי,12,זהב,1,רגיל,1`;
                          const dataArray = fileContent.split('\n').filter(Boolean);
                  
                          const matchingRows = dataArray.filter(row => {
                              const columns = row.split(',');
                              return columns[2] === apiEnterIDValue;
                          });
                  
                          if (matchingRows.length === 0) {
                              console.log('No matching rows found');
                              return false;
                          }
                          console.log('matching rows');
                          const resultArray = matchingRows.map(row => {
                              const columns = row.split(',');
                              return {
                                  IdAction: columns[0],
                                  phone: columns[1],
                                  idphone: columns[2],
                                  name: columns[3],
                                  typeIndex: columns[4],
                                  type: columns[5],
                                  valueIndex: columns[6],
                                  value: columns[7],
                                  sum: columns[8]
                              };
                          });
                  
                          return resultArray;
                      } catch (error) {
                          console.error('Error:', error.message);
                          return false;
                      }
                  }
                  
                  צדיק תמיםצ תגובה 1 תגובה אחרונה
                  0
                  • צדיק תמיםצ מנותק
                    צדיק תמיםצ מנותק
                    צדיק תמים
                    השיב למוטי מן ב נערך לאחרונה על ידי צדיק תמים
                    #9

                    @מוטי-מן אני לא אמור להבין את הלוגיקה שבתוך getAir כי היא לא רלוונטית, שים לב מה ביקשתי:

                    @צדיק-תמים כתב בעזרה לקוד אסינכרוני בnodejs:

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

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

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

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

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

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