איך מתמודדים עם asinc ב-javascript
-
@דוד ל.ט.
אתה צריך לשנות את החשיבה. מה שאתה מעלה זה בכלל לא חסרונות של JS, בנו אותו דוקא לזה.
באמת נראה לי ששאילתות כמו שלך מDB לא כדאי לבצע אסינכרוני, כי אתה לא רוצה תוצאה של כל הקודם זוכה אלא לפי הסדר (המילה מקורית ורק אח"כ וריאציה א' ורק אח"כ וריאציה ב').
כשרוצים לעשות לפי סדר בJS הכי טוב זה להשתמש עם רשימה. משהו כזה:אני לא באמת חושב שזה חסרון....
רוצה ללמוד איך כן מתנהגים עם זה.פורסם במקור בפורום CODE613 ב06/09/2015 22:13 (+03:00)
-
@דוד ל.ט.
במידה ויש לך וריאציות עם אותו עדיפות הכי טוב זה לשלוח אסינכרוני ו"כל הקודם זוכה" ככה אתה מרויח את מעלת הJS.
אין לי עדיפות באיזה מילה הוא מטפל קודם
אבל אני כן צריך שאת התוצאה הוא יכניס לאותו מיקום במערך, כמו של המילה שמחפשים.בלולאה בסיסית הצלחתי
אבל כשנסיתי להוסיף נסיונות נוספים של חיפוש למקרה ולא מוצא
לא הצלחתי לשמר את מספר האינדקס.פורסם במקור בפורום CODE613 ב06/09/2015 22:40 (+03:00)
-
רבי דוד
מה עושה
func(value)
מריץ את הפונקציה שעכשיו רצה (רקורסיה)?לא, אדרבא זה יציאה מרקורסיה. הfunc זה הפרמטר השני, של הפונקציה searchFromDb. זה הcallback לapp.post.
אני הכרתי את המחלקה של הasync והיא אכן שימושית מאוד אבל לא נדרשת למקרה שלך שהוא מקרה קלאסי של nodejs. וודאי שאין צורך באיוונטים.
פורסם במקור בפורום CODE613 ב07/09/2015 10:06 (+03:00)
-
כאן יש הכנסה של הפונקציות לפרוטוטייפ
https://github.com/Level/levelup/blob/master/lib/levelup.jsכאן יש את העדכון
https://github.com/level/levelup/commit/187711c96c
בו החליפו את השימוש ב-codec.js למודול codec.
מאיפה המודול הזה נקרא? בנוד יש קבצים בינארים שמכילים הרבה, אבל פה לא רואה דבר כזה.ואגב, אני כנראה לא בכיוון
חשבתי שאמצע שם את כל הניהול הבינארי, איך ש-level שומר את החומר
אבל הקובץ/מודול הנ"ל כנראה רק עוזר בניהול הקידודים.בקיצור, יש עוד המון מה ללמוד..
פורסם במקור בפורום CODE613 ב07/09/2015 14:52 (+03:00)
-
@דוד ל.ט.
אתה צריך לשנות את החשיבה. מה שאתה מעלה זה בכלל לא חסרונות של JS, בנו אותו דוקא לזה.
באמת נראה לי ששאילתות כמו שלך מDB לא כדאי לבצע אסינכרוני, כי אתה לא רוצה תוצאה של כל הקודם זוכה אלא לפי הסדר (המילה מקורית ורק אח"כ וריאציה א' ורק אח"כ וריאציה ב').
כשרוצים לעשות לפי סדר בJS הכי טוב זה להשתמש עם רשימה. משהו כזה:app.post("/", function (req, res) { searchFromDb('word', function(result) { if(!result) res.status(404).send('Not found'); else res.send(result); }); }); function searchFromDb(word, func) { var searchVariation = { word, word, word}; var getFromDb = function(index) { db.get(searchVariation[index], function (err, value) { if(err) { if(index < searchVariation.length) getFromDb(index++) else func(); } else { func(value) } } } getFromDb(0); }
באוסף searchVariation שמתי רשימה של אותה מילה אבל הכוונה לעשות וריאציות שונות. הבדיקה עליהם תופעל לפי סדר (רק במקרה כישלון של הראשון תתבצע בדיקה של השני).
אם עצם הכנת הוריאציות עולה ביצועים אתה יכול לוותר על רשימה אבל לעשות פונקציה שמקבלת את המקור ורשימה של מה שנוסה כבר ובודקת אם יש מה לנסות עוד.
במידה ויש לך וריאציות עם אותו עדיפות הכי טוב זה לשלוח אסינכרוני ו"כל הקודם זוכה" ככה אתה מרויח את מעלת הJS.אוקי
אפשר למחוק פה עמוד שלם של שטויות שכתבתי
ברשותך, נחזור להתחלה
שאלות פשוטות של הבנה (שכמדומני שלאחריהם אחסוך ממכם הרבה שאלות נספות):searchFromDb('word', function(result)
עד עכשיו חשבתי שפונקציות קול-בק זה קומבינה של פונקציות מסוימות, שמוגדר בהם לקרוא את הפונקציה השניה רק אחרי שמסיים
רק עכשיו (בזכות השורה הזו) אני קולט שזו השיטה הבסיסית לומר לJS לבצע פעולות בצורה סיכרונית.
לדוגמא אם אני רוצה להפעיל 3 פונקציות שכל אחת תופעל רק אחרי שהקודמת מסיימת, אני פותח פונקציה ומכניס כארגומנטים את שלושת הפונקציות.
הבנתי נכון?עוד משהו שאני ממש משתומם
searchFromDb נמצא פעמיים ובכל פעם עם תוכן שונה בתוך ה-{ }.
אז בקריאה לפונקציה איזה מהם מתבצע??אגב
mat ממשיך לטעון שמוכרחים להשתמש עם asinc.פורסם במקור בפורום CODE613 ב08/09/2015 15:21 (+03:00)
-
@דוד ל.ט.
@אהרן
רבי דודמה עושה
func(value)
מריץ את הפונקציה שעכשיו רצה (רקורסיה)?לא, אדרבא זה יציאה מרקורסיה. הfunc זה הפרמטר השני, של הפונקציה searchFromDb. זה הcallback לapp.post.
אני הכרתי את המחלקה של הasync והיא אכן שימושית מאוד אבל לא נדרשת למקרה שלך שהוא מקרה קלאסי של nodejs. וודאי שאין צורך באיוונטים.
תמיד תמיד הפעלה של הפונקציה הבאה בארגומנט עוצרת את הפונקציה הנוכחית?
פורסם במקור בפורום CODE613 ב08/09/2015 15:31 (+03:00)
-
ובכלל איך רקורסיה עוזרת בפונקציה אי סינכרונית?
הלולאה יכולה להסתיים לפני תשובת הקול-בק הראשונה, ואז להתחיל לענות תשובות שלא לפי הסדר!הנקודה פה היא ההפעלה של הפונקציה הבאה רק אחרי שחוזר מהcallback תשובה שלילית. הנקודה היא לא הרקורסיה, הרקורסיה זה סתם בגלל שהפונקציונליות חוזרת על עצמה.
פורסם במקור בפורום CODE613 ב08/09/2015 15:50 (+03:00)
-
מה עושה
func(value)
מריץ את הפונקציה שעכשיו רצה (רקורסיה)?לא, אדרבא זה יציאה מרקורסיה. הfunc זה הפרמטר השני, של הפונקציה searchFromDb. זה הcallback לapp.post.
אני הכרתי את המחלקה של הasync והיא אכן שימושית מאוד אבל לא נדרשת למקרה שלך שהוא מקרה קלאסי של nodejs. וודאי שאין צורך באיוונטים.
תמיד תמיד הפעלה של הפונקציה הבאה בארגומנט עוצרת את הפונקציה הנוכחית?
ממש לא.
לא הבנתי.
יש שם פונקצייה (getFromDb ) של פניה לDB. התוצאה חוזרת לפונקציה נוספת (אנונימית). היא בודקת את התוצאה. ישנו if שהודק אם ישנה שגיאה של ערך לא נמצא. במידה ואכן ישנה שגיאה, מורצת הפונקציה העליונה שוב - מה שנקרא רקורסיה. אם אין שגיאה - ישנו ערך, אז מוחזר הערך ע"י הפעלת הפונקציה שניתנה כארגומנט (func).פורסם במקור בפורום CODE613 ב08/09/2015 15:55 (+03:00)
-
משתגע
אולי אני כ"כ מטומטם
אבל בטוח שאני מפספס משהו מאוד בסיסיif(index < searchVariation.length) getFromDb(index++) else func();
func() שווה ל'אל תעשה כלום'?
באותה מידה השורה היתה יכולה להיות ריקה?func(value)
ואז מה קורה? לאן זה נשלח/חוזר??
לא אלאה מלומר שוב: תודה!
פורסם במקור בפורום CODE613 ב08/09/2015 16:12 (+03:00)
-
תסתכל בהודעה המקורית שלי.
יש שתי קטעי קוד. אתה מדבר על הקטע השני שם יש פונקציה בשם searchFromDb, היא מקבלת שתי ארגומנטים: מילה לחיפוש ופונקציית קלבאק, כלומר "מה לעשות אחרי" הצלחה או כישלון.
הfunc() זה הפעלה של הפונקציה שמועברת כארגומנט השני. במקרה שלנו הערך האקטואלי שלה חשוף בקטע קוד הראשון: שם אני קורא לפונקציה searchFromDb ואני מזין לפרמטר הראשון סתם טקסט לבדיקה, ולשני פוקנציה שהיא זו שתופעל לבסוף. היא מקבלת בקטע השני את השם func כי זה שם הארגומנט השני.
מקוה שהבנת, אשמח לעזור עוד אז אל תרפה. רק תדייק מה אתה מבין ומה לא.פורסם במקור בפורום CODE613 ב08/09/2015 16:24 (+03:00)
-
func() שווה ל'אל תעשה כלום'?
באותה מידה השורה היתה יכולה להיות ריקה?אם לא הייתי כותב כלום, אז כלום לא היה קורא והלקוח (הבקשה מהדפדפן) לעולם לא הייתה נענית.
ע"י הפעלה של הfunc ללא פרמטר מורצת השורה הזו:res.status(404).send('Not found');
תוכל לראות איך ע"י עיון בקטע קוד הראשון.
פורסם במקור בפורום CODE613 ב08/09/2015 16:28 (+03:00)
-
ברור שאני מסתכל על הקוד המקורי
מאיפה אני מעתיק ועל מה אני שואל ?
@דוד ל.ט.func() שווה ל'אל תעשה כלום'?
באותה מידה השורה היתה יכולה להיות ריקה?אם לא הייתי כותב כלום, אז כלום לא היה קורא והלקוח (הבקשה מהדפדפן) לעולם לא הייתה נענית.
ע"י הפעלה של הfunc ללא פרמטר מורצת השורה הזו:res.status(404).send('Not found');
תוכל לראות איך ע"י עיון בקטע קוד הראשון.
כאילו כתוב
func = function(arg) { return arg }
וזו הסיבה שהפונקציה מחזירה את הערך לפונקציה שהפעילה אותה?
איך הקסם הזה נהיה לבד?פורסם במקור בפורום CODE613 ב08/09/2015 17:09 (+03:00)