פעולה סינכרונית nodejs
-
-
@dovid אמר בפעולה סינכרונית nodejs:
@חוקר אמר בפעולה סינכרונית nodejs:
השאלה היא א"כ מה הכי פרקטי שמצד אחד יש לי את הנתונים לביצוע העיבוד, ומצד שני יש לי מערך של כל הפרומיסים עבור ה Promise.all.
האם יש משהו בJS הצבת משתנה ששמו דינאמי, כמו בPHP למשל:לא הבנתי את המשפטים והקשר ביניהם.
אני חשבתי על כיון של הצבת משתנה עבור כל לולאה נניח בשם
'num' + i
ובמקביל ליצור מערך שדוחפים אליו את השמות הדינאמים.
ואז להעביר לPromise.all את המערך של שמות המשתנים שעליו להמתין עד שיגמרו את פעילותם. -
זה גם הלך לי.
האם יש רעיון יותר טוב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 בסיום
-
@avr416 אמר בפעולה סינכרונית nodejs:
@חוקר מה באת להרויח כאן?
בשני המקרים אתה מחזיק מערך של כל הפרומיסים, ואז קורא לו בפונקציה promise.all.
אלא שעכשיו גם הוספת את זה למערך גלובאלי נוסף.. בשביל מה?כדי שיהיה לי גישה אח"כ לעיבוד הנתונים.
אני צריך אפשרות לעבד כל אחת מהתוצאות.
את העיבוד אני יעשה בתוך ה promise.all.
בראשון הכל נכנס לתוך מערך בלי שיהיה לי את השם של התוצאה ואז אין לי איך לעבד את התוצאה לכל אחד, לדעת של מי כל תוצאה. -
@avr416
גלובל הוא הפיתרון למה ששאלתי כאן למעלה https://tchumim.com/post/61118
הוא מערך של כל המשתנים vars בסקופ.
אבל אכן חזרתי בי מהצורך להשים אותם כמשתנה גלובאלי, אלא ליצור אובייקט נפרד לקבלת התוצאות, ואז ליצור משהו בסגנון שציינת עבור ה Promise.all -
@avr416 אמר בפעולה סינכרונית nodejs:
@חוקר
אם global הוא אובייקט, אתה יכול להמיר אותו למערך ולהעביר אותו ישירות לפרומיס.all וא"צ ליצור עוד מערך של פרומיסס.Promise.all(Object.keys(global).map(k=>global[k]))
זה אמור להחזיר לך מערך של כל הפרומיסים שדחפת לגלובל
בכל מקרה, אני חוזר בי..
הדרך שלך עדיפה מבחינת ביצועים על ההצעה שלי. כי אתה עשית הכל בלולאה אחת, ואני הוספתי לך כאן עוד כמה (מאחורי הקלעים..) -
@חוקר אם אתה רוצה בתוצאת הפרומיס נתון נוסף ממה שהוא מחזיר במקור, אתה יכול להוסיף את הנתון בthen שבעצם יוצר פרומייז נוסף בהסתיים הראשון:
var promises = []; for (let i =0;i<3;i++) { console.log('files'+i); var pr = ftp.list($`/limudklali/${HDate.getFullYear()}/${Month_arr[HDate.getMonth()]}/`) .then(x => { return {source: i, result: x} })); promises.push(pr); } Promise.all(promises).then(function(values) { ftp.end(); console.log(values); });