עזרה לקוד אסינכרוני ב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?
(אני מכיר קצת קולבקים אבל לא הבנתי איך להכניס את זה במקרה הזה בלי להשתמש בעוד פונקציות)
-
@מוטי-מן כתב בעזרה לקוד אסינכרוני ב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 של ימות המשיח?
שמה הם קיבלו ממך, איזה תשובה? -
@מוטי-מן אני לא מצליח לשחזר את התופעה. בדקתי את הקוד שהבאת אצלי:
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 אסימונים וכו'.
אני מציע ש:- תביא את הקוד המלא (את כל הפונקציה)
- תוודא שאתה משתמש בגרסה האחרונה של ספריית yemot-router2, נכון להיום זה 6.1.6 (אתה יכול לראות את הגרסה שמותקנת בקובץ package.json)
-
@צדיק-תמים אתה צודק, הבעיה שזה לא נשלח לימות המשיח היתה אחרת, עכ"פ עדיין למרות שההודעה נשלחת לימות המשיח ומופיעה בלוג, עדיין נשמע שקט,
מה שמעניין ששמתי לב שהבעיה מתרחש רק כשיש יותר מאסימון אחד, וכן כשאני מעתיק את הטקסט שמופיע בלוג של ימות ומריץ את זה ישר עליו, זה עובד מצויין, אבל כשהטקסט משורשר באמצעות הקוד, זה משמיע שקט, כך שנראה שהבעיה היא בלוגיקה של הקטע שבשורות 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); } }
-
@מוטי-מן זה אמנם הפונקציה המלאה, אבל זה לא דוגמה טובה לשחזור הבעיה,
כי היא קוראת לפונקציהgetAir
שאין לי מושג מה היא מחזירה, ולפונקצייתhandlerReceive
שאין לי מושג מה תפקידה. אני רוצה שתביא דוגמה שלא תלויה בשום נתון שלא מופיעה בה, אתה יכול לדוגמה להכניס נתוני דמה לקוד (כלומר שisAir
יהיה איזה ערך קשיח כלשהוא שאתה רואה שאיתו יש את הבאג)
שיהיה אפשר לעשות העתק הדבק ולהריץ, ולקבל את אותה בעיה, ואז אוכל לנסות למצוא פתרון -
@צדיק-תמים קודם כל תודה על העזרה!
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; } }
-
@מוטי-מן אני לא אמור להבין את הלוגיקה שבתוך
getAir
כי היא לא רלוונטית, שים לב מה ביקשתי:@צדיק-תמים כתב בעזרה לקוד אסינכרוני בnodejs:
דוגמה שלא תלויה בשום נתון שלא מופיעה בה, אתה יכול לדוגמה להכניס נתוני דמה לקוד (כלומר שisAir יהיה איזה ערך קשיח כלשהוא שאתה רואה שאיתו יש את הבאג)
שיהיה אפשר לעשות העתק הדבק ולהריץ, ולקבל את אותה בעיה