הנה בדיקה נוספת כשהזכרון גדל פי 15 מהבדיקה הקודמת
איך יתכן שגלובל גדול יותר??
אהרן
-
עזרה בדיבוג הזכרון של כרום -
עזרה בדיבוג הזכרון של כרוםאני מדבג אפליקצית nodejs
מאוד מאוד אשמח להסבר, מה ההבדל בין 2 הטורים השמאליים? ומהו הטור השמאלי מימין?
ואיך זה שסך כל האחוזים הם יותר מ-100??
בהנחה שאין משתנים שמתפחים יותר מדי אלא הבעיה היא שהם משוכפלים שלא לצורך
איפה בודקים א"ז?
השורה הראשונה היא הפונקציות ברירת מחדל של JS? אז נכון שאין מה להסתכל ע"ז?
-
יש אפשרות לסוג הערה נוסף סקירה, שוליים וסיום, בוורד?איך הייתם מציעים לשמור כותרות צד?
-
מישהו יכול להסביר על ההמהרה במאות האחוזים?https://javascript-ninja.fr/optimizing-speed-in-node-js/
מה ההסבר למה שהוא עשה?
-
NVM לווינדוס, איזה מומלץ?המקורי לא תומך בווינדוס.
-
await גורם לפעמים לפיצוץ הזכרון לג'יגותconst global1 = 1000000 const global2 = 2000000 const global3 = 3000000 const global4 = 4000000 const global5 = 5000000 const global6 = 6000000 class dbCtrl { static async getData( ...arg ) { let data = await new Promise( resolve => { setTimeout( resolve, 500 ) }) //db.get( ...arg ).catch( /*logIfBud*/ ) return data && data.toString('utf8').split(',') } } class dataCtrl { constructor( name ) { this.name = name } async getName() { let count = 0 let data while( !this.tryFinish && /*Temporary:*/ (count++) < 5000 && !(data = await dbCtrl.getData( this.name )) ) { this.tryVariations() } this.fullName = data return this.fullName } tryVariations() { this.name = this.name.replace(/"/g, '') } } class mainCtrl { constructor() { this.names = ['david', 'aharon'] } async getAllNames() { this.fullNames = await Promise.all( this.names.map( n=> new dataCtrl(n).getName() ) ) } } new mainCtrl().getAllNames()
הקוד הזה עובד בסדר
אבל האמיתי לא
אולי בגלל שיש שם גלובלים שנכלאים (closer) ומשוכפלים בפונקציות? -
await גורם לפעמים לפיצוץ הזכרון לג'יגותזה הקוד
while( !this.tryFinish && !(data = await getData( this.Name )) ) { this.tryVariations() }
לא תמיד, רק אם
getData
רץ יותר מדי פעמים
או שהפונקציה שמריצה אותה מורצת יותר מדי פעמים במקביל (מה שקורה ברצה אסינכרונית)
אם לא, זה אוכל א"ז ללא בעיה.יש לכם כיון מדוע זה קורה ומה הפתרון?
בעבר
tryVariations
הריץ בסופו, את הפונקציה שעוטפת את הקוד הזה, רקורסיה, אבל בשביל בשביל שהמחסנית לא תתמלא, הרצתי א"ז בתוך setTimeout.זה בדיוק מה שרציתי לחסוך, את השרשורים המבלבלים האלו.
-
שימוש ב-MongoDB בנוד@dovid אמר בשימוש ב-MongoDB בנוד:
לא התכוונתי דוקא קלאבק, התכוונתי שהאפליקציה כולה תיטען מתוך פונקציה.
לא הבנתי מדוע לא להשתמש ב-await
(בפונקצייתinsert
שאמור להיקרא מתוך פונקציה, לא ב-require
)? -
שימוש ב-MongoDB בנוד@dovid אמר בשימוש ב-MongoDB בנוד:
נוד מאמצת ממש לאט את ההתקדמויות האלה
שמח שהם מאפשרים לדנו לעקוף אותם בקלות
-
שימוש ב-MongoDB בנוד@dovid אמר בשימוש ב-MongoDB בנוד:
למה לא להכניס את כל טעינת האפליקציה לקאלבק?
לחזור לטרום ימי הפרומיז?
-
שימוש ב-MongoDB בנוד@yossiz אמר בשימוש ב-MongoDB בנוד:
הפיתרון הוא לכאורה להחזיר אובייקט שיעטוף את ה-
db
. כל פונקציה שנקרא על העטיפה יעשה קודםawait
לאובייקט ה-db
האמיתי ואז יעביר את הפונקציה הלאה לאובייקט האמיתי.האם יש דרך לעשות עטיפה כזאת בלי יותר מדי boilerplate? פשוט להגיד ל-JS שכל פונקציה שאני יקרא על האובייקט לא משנה מה השם שלו יעבור דרך קוד העטיפה?
לא מבין את הבעיה
הקלאס מיד חוזר מכיל בתוכו את ה-DB
ופונקציתinsert({1:2})
יכיל בתוכו בדיקה אם ה-DB מחובר, ומחזיר תמיד פרומיז.כך תמיד עושים?!
-
שימוש ב-MongoDB בנוד -
ג'ימייל - ההודעה לא נשלחה@יוסף-בן-שמעון אמר בג'ימייל - ההודעה לא נשלחה:
לעיתים רחוקות אני מקבל הודעה כזו בשליחת מייל
ולא מועיל לנסות שוב ושוב, גם רענון של הדף לא עוזר, מה זה?זה בדר"כ בגלל תו נסתר לפני\אחרי הכתובת
נסה ללכת לסוף\תחילת הכתובת ואז מעד אחד עם החץ תגלה שיש שם תו נסתר.(גודל פשוט לא יודעים למחוק אותו דאאא)
-
איך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?@dovid אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
למה שלא תעצב שהם יחזירו בעצמם פרומייז
לא אוהב את העטיפה של הפרומיז סביב כל הפונקציה
וגם שיש כבר פונקציות מוכנות שעבדו עם הספריה async, אז זה מוכן לפונקציה הזאת.במקרה שכן קצר יותר להשתמש ישירות ב-Promise.all.
-
איך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?@dovid אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
@אהרן אההממ אז המתודות הללו נדפקות בכל קלאבק ששייך לסקופ שונה?
גם כשקאלבק שייך לאותו סקופ
הוא מקבל סקופ חדש, של יצירת asyncMap.אם כשמעבירים את זה כפונקציה ללא call זה עובד
זה לא
-
איך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?@dovid אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
@אהרן אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
אבל ב-asyncMap זה לא שייך מכיון שצריך להכניס ארגומנטים לתוך הקול-בק.
איפה צריך this.
בתוך ה-task
כשקוראים לו מתוך מתודה של מופע שמשתמשים יותר ב-this, זה יותר חסר.
במקרה הזה, ה-task עצמו הוא גם מתודה של המופע. -
איך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?@dovid
אויש כמה שטויותהתכוונתי להביא את ההוכחה מ-setTimeout
אבל אז גליתי שהוא מקבל את ה-this בגלל הפונקציה האנונימית שכתובה מתוך הפונקציה שקוראת וממילא מקבלת את ה-thissetTimeout( _=> myFunc() )
אבל ב-asyncMap זה לא שייך מכיון שצריך להכניס ארגומנטים לתוך הקול-בק.
-
איך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?@יוסף-בן-שמעון אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
@אהרן אז תעביר אותו כפרמטר
איך console.log כן מכניס את הדיס הנכון?
-
איך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?~~ככה!! ~~
const asyncMap = (arr, task) => Promise.all( arr.map((row, idx, arr) => new Promise((reslove) => task.call(null ,row, reslove, idx, arr)).catch(console.log)) )
נראה שה-this של הגלובל סקופ הוא undefined
צריך לאפס אותו ל-nullנראה שטעיתי, רגע
-
איך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?@יוסף-בן-שמעון
להיות מסוגל להשתמש בthis של המופע שקורא לפונקציה הנ"ל.