ASYNC/AWAIT
-
האם פונקציה שמכילה שורה של AWAIT
לא תמשיך הלאה לפני שתקבל תשובה?
אם כן אז מדוע זה לא כך ?
אני קוראת לפונקציה שמחזירה פרומיס עם ASYNC/AWAIT
אך הפונקציה מדפיסה את השורה הבאה לפני שקבלה את התשובה מהפונקציה הפנימית -
c const getAllMembers = async function() { let members = await membersRest.getAllMembers(); let membersData = members.data; let membersArr = []; let mArr = []; let mov = []; membersData.forEach(z => { let newMember = { _id: z._id, Name: z.Name, Email: z.Email, City: z.City, Movies: mov } membersArr.push(newMember); }) let ss = await subscriptionRest.getSubscriptions(); let ssData = ss.data; if (ssData) { // let result = await subscriptionBL.getAllSubscriptions(); let result = await getSsForMembers(ssData, membersArr); console.log("result", result); if (result != "not found") { return result; } else { return membersArr; } } else { return membersArr; } } const getSsForMembers = async function(ss, mm) { let finalMmArr = {}; Promise.all(ss.map(async x => { let found = mm.find(y => y._id == x.MemberID); if (found) { let memId = x.MemberID; let mem = await membersRest.getMember(memId); console.log("mem", memId); let memData = mem.data; memData.Movies = x.Movies let mArr = mm.filter(w => w._id != x.MemberID); mArr.push(memData); finalMmArr.data = mArr; console.log("finalMmArr", finalMmArr); return finalMmArr; else { return ("not found"); } })) }
-
c const getAllMembers = async function() { let members = await membersRest.getAllMembers(); let membersData = members.data; let membersArr = []; let mArr = []; let mov = []; membersData.forEach(z => { let newMember = { _id: z._id, Name: z.Name, Email: z.Email, City: z.City, Movies: mov } membersArr.push(newMember); }) let ss = await subscriptionRest.getSubscriptions(); let ssData = ss.data; if (ssData) { // let result = await subscriptionBL.getAllSubscriptions(); let result = await getSsForMembers(ssData, membersArr); console.log("result", result); if (result != "not found") { return result; } else { return membersArr; } } else { return membersArr; } } const getSsForMembers = async function(ss, mm) { let finalMmArr = {}; Promise.all(ss.map(async x => { let found = mm.find(y => y._id == x.MemberID); if (found) { let memId = x.MemberID; let mem = await membersRest.getMember(memId); console.log("mem", memId); let memData = mem.data; memData.Movies = x.Movies let mArr = mm.filter(w => w._id != x.MemberID); mArr.push(memData); finalMmArr.data = mArr; console.log("finalMmArr", finalMmArr); return finalMmArr; else { return ("not found"); } })) }
-
@מוטי-אורן
תקנתי את הקוד
הRESULT מודפס לפני MEM -
@מוטי-אורן
תקנתי את הקוד
הRESULT מודפס לפני MEM -
@שרה-רחל יש בקוד בעיה נוספת, הפונקציהבPromise.all נקראת עבור כל אחד מהפריטים ברשימה, ומחזירה עבור כל אחד או not-found או אובייקט משותף לכלל האיברים.
הפונקציה הקוראת בודקת אם הערך הוא not-found אבל הוא לעולם לא יהיה not-found כי התוצאה של Promise.all היא תמיד מערך של תוצאות (בכל תוצאה יכול להיות not-found).
בקיצור הפונקציה getSsForMembers צריכה כתיבה מחדש, אשמח לעזור אם אדע בגדול מה היא מנסה לעשות. -
@yossiz
נכון זה עזר
האמת שהPROMISE.ALL
כבר היה חלק מהפתרון
מה הוא בעצם פותר ?
הוא לא אמור לבוא כשיש כמה קריאות אסיכרוניות?
בפונקציה זו יש קריאה אחת בתוך הסוגריים של PROMISE.ALL
אז איך זה פתר את הבעיה? -
@שרה-רחל הפונקציה Promise.all מטפלת במקרה שיש הרבה await לעשות ואת רוצה לחכות שכולם יתבצעו ולקבל את התוצאות כמערך.
-
@שרה-רחל ss.map הופך את מערך הss למערך של פונקציות await, כל אחת מהסוג שכתובה בסוגריים... כלומר הטיפול של הפונקציה יתבצע מול כל פריט בעוד הוא נכתב כנראה במקור לטיפול בכלל המערך ביחד. אשמח לדעת מה הפונקציה עושה, נראה שהיא מאחדת בין שני רשימות שונות, ובנוסף מבקשת מהשרת השלמת מידע.
-
@שרה-רחל יש בקוד בעיה נוספת, הפונקציהבPromise.all נקראת עבור כל אחד מהפריטים ברשימה, ומחזירה עבור כל אחד או not-found או אובייקט משותף לכלל האיברים.
הפונקציה הקוראת בודקת אם הערך הוא not-found אבל הוא לעולם לא יהיה not-found כי התוצאה של Promise.all היא תמיד מערך של תוצאות (בכל תוצאה יכול להיות not-found).
בקיצור הפונקציה getSsForMembers צריכה כתיבה מחדש, אשמח לעזור אם אדע בגדול מה היא מנסה לעשות.@dovid
MEMBER:Name: String, Email: String, City: String
Subscriptions
MemberId: String, Movies: [String]
הפונקציה getAllMembers
מציגה את כל הלקוחות אבל אמורה לבדוק אם יש להם מנוי לסרטונים
לכן היא מטעינה את כל המנויים ועבור כל מנוי שולחים לפונקציה השניה getSsForMembers
שם בודקת אם יש למנוי _ID שמתאים לאאחד מה MemberId של המנויים
ומחזירה את המערך של כל המנויים .
קוראים לפונקציה getAllMembers פעם אחת -
@dovid
MEMBER:Name: String, Email: String, City: String
Subscriptions
MemberId: String, Movies: [String]
הפונקציה getAllMembers
מציגה את כל הלקוחות אבל אמורה לבדוק אם יש להם מנוי לסרטונים
לכן היא מטעינה את כל המנויים ועבור כל מנוי שולחים לפונקציה השניה getSsForMembers
שם בודקת אם יש למנוי _ID שמתאים לאאחד מה MemberId של המנויים
ומחזירה את המערך של כל המנויים .
קוראים לפונקציה getAllMembers פעם אחת@שרה-רחל אני לא לגמרי מבין, כתבתי שלד קוד שלכאורה עושה כל מה שקיים כעת, תוכלי לומר מה חסר בו?
const getAllMembers = async function () { let members = await membersRest.getAllMembers(); let membersArr = members.data.map(z => { return { _id: z._id, Name: z.Name, Email: z.Email, City: z.City, Movies: [] } }); let ss = await subscriptionRest.getSubscriptions(); let ssData = ss.data; for (const sub of ss.data) { var memberFind = membersArr.find(x => x._id == sub.MemberID); if (memberFind) memberFind.Movies = sub.Movies; else console.log(`the member ${sub.MemberID} not found in the members list, but have subscrition!`) } return membersArr; }
-
@שרה-רחל אני לא לגמרי מבין, כתבתי שלד קוד שלכאורה עושה כל מה שקיים כעת, תוכלי לומר מה חסר בו?
const getAllMembers = async function () { let members = await membersRest.getAllMembers(); let membersArr = members.data.map(z => { return { _id: z._id, Name: z.Name, Email: z.Email, City: z.City, Movies: [] } }); let ss = await subscriptionRest.getSubscriptions(); let ssData = ss.data; for (const sub of ss.data) { var memberFind = membersArr.find(x => x._id == sub.MemberID); if (memberFind) memberFind.Movies = sub.Movies; else console.log(`the member ${sub.MemberID} not found in the members list, but have subscrition!`) } return membersArr; }
@dovid גם הקוד הזה ארוך מידי, כי אני שם לב שהMap הראשון לא עושה כלום, הקוד הזה שקול:
const getAllMembers = async function () { let membersArr = await membersRest.getAllMembers(); let ss = await subscriptionRest.getSubscriptions(); let ssData = ss.data; for (const sub of ss.data) { var memberFind = membersArr.find(x => x._id == sub.MemberID); if (memberFind) memberFind.Movies = sub.Movies; else console.log(`the member ${sub.MemberID} not found in the members list, but have subscrition!`) } return membersArr; }
-
@dovid גם הקוד הזה ארוך מידי, כי אני שם לב שהMap הראשון לא עושה כלום, הקוד הזה שקול:
const getAllMembers = async function () { let membersArr = await membersRest.getAllMembers(); let ss = await subscriptionRest.getSubscriptions(); let ssData = ss.data; for (const sub of ss.data) { var memberFind = membersArr.find(x => x._id == sub.MemberID); if (memberFind) memberFind.Movies = sub.Movies; else console.log(`the member ${sub.MemberID} not found in the members list, but have subscrition!`) } return membersArr; }
-
@dovid גם הקוד הזה ארוך מידי, כי אני שם לב שהMap הראשון לא עושה כלום, הקוד הזה שקול:
const getAllMembers = async function () { let membersArr = await membersRest.getAllMembers(); let ss = await subscriptionRest.getSubscriptions(); let ssData = ss.data; for (const sub of ss.data) { var memberFind = membersArr.find(x => x._id == sub.MemberID); if (memberFind) memberFind.Movies = sub.Movies; else console.log(`the member ${sub.MemberID} not found in the members list, but have subscrition!`) } return membersArr; }
-
@dovid
נראה נכון
אני כבר בודקת
רק מענין אותי למה בקוד הראשוני ששמתי (תקנתיקצת)
הfinalMmArr מדפיס תוכן
בזמן שהRESULT מדפיס אחרי כן UNDEFINDED@שרה-רחל אמר בASYNC/AWAIT:
@dovid
נראה נכון
אני כבר בודקת
רק מענין אותי למה בקוד הראשוני ששמתי (תקנתיקצת)
הfinalMmArr מדפיס תוכן
בזמן שהRESULT מדפיס אחרי כן UNDEFINDEDלפני התיקון של @yossiz (לשים return או await) זה לא הגיוני שהוא הדפיס not-found.
אחרי התיקון, הוא היה אמור להדפיס את זה אבל בתוך מערך [.... .... "not-found"]