איך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?
-
@אהרן אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
פונקצית החץ לא אמור ליצור א"ז?
לא. הפוך, פונקציית חץ אין לו this של עצמו אלא של ה-scope שמסובב אותו.
אפשר להשתמש ב-function.apply כדי לאגוד את הפונקציה לאובייקט שאתה רוצה. -
@yossiz אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
@אהרן אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
פונקצית החץ לא אמור ליצור א"ז?
לא. הפוך, פונקציית חץ אין לו this של עצמו אלא של ה-scope שמסובב אותו.
נסיתי לשנות א"ז לפונקציות רגילות ולא עזר.
אפשר להשתמש ב-function.apply כדי לאגוד את הפונקציה לאובייקט שאתה רוצה.
עשיתי א"ז ע"י bind, אבל לא נוח להוסיף א"ז לכל הרצה של הפונקציה.
-
@אהרן תעשה שכל המחלקות שלך יירשו ממחלקת אם עם הפונקציה הזו
-
@יוסף-בן-שמעון אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
@אהרן תעשה שכל המחלקות שלך יירשו ממחלקת אם עם הפונקציה הזו
זו האפשרות היחידה? -
@אהרן אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-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 של המופע שמפעיל אותו?:
@אהרן אז תעביר אותו כפרמטר
איך console.log כן מכניס את הדיס הנכון?
-
@dovid
אויש כמה שטויותהתכוונתי להביא את ההוכחה מ-setTimeout
אבל אז גליתי שהוא מקבל את ה-this בגלל הפונקציה האנונימית שכתובה מתוך הפונקציה שקוראת וממילא מקבלת את ה-thissetTimeout( _=> myFunc() )
אבל ב-asyncMap זה לא שייך מכיון שצריך להכניס ארגומנטים לתוך הקול-בק.
-
@dovid אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
@אהרן אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
אבל ב-asyncMap זה לא שייך מכיון שצריך להכניס ארגומנטים לתוך הקול-בק.
איפה צריך this.
בתוך ה-task
כשקוראים לו מתוך מתודה של מופע שמשתמשים יותר ב-this, זה יותר חסר.
במקרה הזה, ה-task עצמו הוא גם מתודה של המופע. -
@אהרן אההממ אז המתודות הללו נדפקות בכל קלאבק ששייך לסקופ שונה?
אם כשמעבירים את זה כפונקציה ללא call זה עובד, אז ככה אמור לעבוד יופי:const asyncMap = (arr, task) => Promise.all( arr.map((row, idx, arr) => new Promise(reslove => task(row, reslove, idx, arr)).catch(console.log)) )
אני אישית בחיים לא פונה לthis הארור של js...
-
@dovid אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
@אהרן אההממ אז המתודות הללו נדפקות בכל קלאבק ששייך לסקופ שונה?
גם כשקאלבק שייך לאותו סקופ
הוא מקבל סקופ חדש, של יצירת asyncMap.אם כשמעבירים את זה כפונקציה ללא call זה עובד
זה לא
-
@dovid אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
למה שלא תעצב שהם יחזירו בעצמם פרומייז
לא אוהב את העטיפה של הפרומיז סביב כל הפונקציה
וגם שיש כבר פונקציות מוכנות שעבדו עם הספריה async, אז זה מוכן לפונקציה הזאת.במקרה שכן קצר יותר להשתמש ישירות ב-Promise.all.
-
@אהרן לא הבנתי את הסיטואציה אז אני לא יודע מה היתה הבעיה שלך והאם היא כבר נפתרה. רק דבר אחד אני יכול להגיד, כשאתה מעביר קולבק בצורה כזו:
callToFunc(this.callback)
הקולבק מתנתק מהאבא שלו, והוא לא יזהה את הזיס שלו.
אם זו הבעיה שלך, הפיתרון הוא להעביר את הקולבק כך:callToFunc(() => this.callback())
-
@יוסף-בן-שמעון אמר באיך אני מייצר פונקציה בגלובל שה-this שלה יהיה ה-this של המופע שמפעיל אותו?:
אם זו הבעיה שלך, הפיתרון הוא להעביר את הקולבק כך:
callToFunc(() => this.callback())
או כך:
callToFunc(function() { return this.callback() })
(אני רק מבהיר שזה לא קשור לפונקציות חצים.) -
@yossiz לא מדויק, בצורה שכתבת אתה בכלל לא מעביר קולבק כי בפונקציה האנונימית שלך כבר יש זיס עצמי, צריך להעביר אותו עם פונקצית חץ, תריץ את הקוד הזה ותראה את שלש ההדפסות:
function callToFunc (callback) { callback() } class Class { constructor() { callToFunc(this.callback) callToFunc(() => this.callback()) callToFunc(function () { return this.callback() }) } callback () { console.log(this) } } new Class()