הדרך הנכונה לביצוע קוד אסינכרוני
-
איך אפשר לבצע את הקוד הבא שיקרה שורה אחר שורה בjs בדרך הקלה ביותר
במציאות מה שקורה שהreturn האחרון חוזר לפני כל פעולות הmap.אני לא כועס על js אני יודע שככה הטמבל הזה עובד, אני רק רוצה לדעת איך בכל זאת...
אני יודע שיש asinc וכו' השאלה איפה בדיוק שמים את הawait אם בכלל...export function getAmountFromMonthlyDeposit(MonthlyDeposit, children, data, multi = true){ if(!multi) children = [children]; const groupByYears = _.groupBy(children, (i) => i.marriageAge - i.age); console.log(groupByYears) data = _.sortBy(data, i => i.amount).reverse(); data = JSON.parse(JSON.stringify(data)); let _return = false; data.map( a => { if(_return) return; a.innerPrograms.map( (b, bi) => { if(_return) return; console.log('iii') let _amountMonthly = (a.amount / b.doublingRatio) / b.depositMonths; a.innerPrograms.points = _amountMonthly/10; a.innerPrograms._amountMonthly = _amountMonthly; }); let points = {}; Object.keys(groupByYears).map((key ) => { if(_return) return; let program = getNearestAmount(a.innerPrograms, Number(key), 'yearsOfWaiting'); points[key] = {program: program, points: program.points * groupByYears[key].length, countChildren:groupByYears[key].length} }); let amountPerPoint = MonthlyDeposit / _.sumBy(points, 'points'); Object.keys(points).map( (p) => { if(_return) return; let totalPerChild = (points[p].points / 2) * amountPerPoint; if( totalPerChild >= points[p].program._amountMonthly){ _return = (totalPerChild * points[p].program.depositMonths) * points[p].program.doublingRatio; } }); }); return _return; }
-
JS היא שפה סינכרונית ב99%. האחוז שלא סינכרוני כולו פעולות דיסק/רשת, אין כאלו פה.
וכל הקוד הזה נראה סינכרוני לגמרי, כנראה הבעיה היא מבאג אחר,
אני מבין שקשה לפתור את הבאג כי גם לי היה מאוד קשה קריאת הקוד...
תפרט יותר. ותשתדל מאוד לעשות דוגמה קלה לעצמך ולנו שמחיש את פעילות הקוד.
יש שפע של עורכי קוד אינטרנטיים, תוכל לשתף אותנו עם המחשה חיה. -
@ש-ב-ח כמה הערות:
א.
Js לא טמבל, ובכוונה הוא א-סינכרוני, כדי שהדפדפן לא יקפא כשהוא מחכה לתגובות מהשרת או מבצע פעולות לדיסק וכדו'.לשאלתך, פונקציה שמחזירה פרומיס, דהיינו שהיא א-סינכרונית, אפשר לכתוב בחתימה שלה async, ואז לקרוא לה עם await, כלומר תחכה עד שתחזור התשובה.
(מאחורי הקלעים js ממיר את זה לpromise, ומאחורי זה בעצם הופך לcallback..
כי זה בעצם רק צורת כתיבה שהיא יותר קריאה) -
@avr416 אמר בהדרך הנכונה לביצוע קוד אסינכרוני:
Js לא טמבל
סליחה על הפגיעה בכבוד הרמטכל
ב"ה הסתדרתי
הפכתי כל map לfor וזה עובד
כנראה שבכל זאת map לא ממתין לסיומו לפני return של הפונקציה
גם בbreak point על הדפדפן ראיתי את תחילת הmap מיד אחרי זה את הreturn
לא יודע מה ההסבר אבל זה מה שהיה
אולי בהזדמנות אנסה לחקור זאת
(וזה לא נכון לגבי כל map כי ניסיתי לעשות הדגמה קטנה (כמו ש@dovid הציע, וכנראה שהוא צדק שהקוד שלי הבעיתי אך בהחלט יש כאן גם בעיה בקוד שלי וגם בmap כי כאמור שיניתי את הmap לfor וזה עבד...)אהה @dovid, גם קצת ניקיתי את הקוד שיהיה יותר קריא