דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. איך מתמודדים עם asinc ב-javascript

איך מתמודדים עם asinc ב-javascript

מתוזמן נעוץ נעול הועבר ארכיון code613m
41 פוסטים 3 כותבים 2.6k צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • א מנותק
    א מנותק
    אהרן
    כתב ב נערך לאחרונה על ידי
    #3

    @softs

    אכן js היא שפה מאוד שונה משפות אחרות והמבנה שלה נוח מאוד לעבודה אסינכרונית, צריך ללמוד לחיות עם זה ולא להילחם בזה.

    אני ממתין לך בסבלנות
    ואתה בורח אחרי שורה אחת?
    😮
    🙂

    פורסם במקור בפורום CODE613 ב06/09/2015 03:01 (+03:00)

    תגובה 1 תגובה אחרונה
    0
    • א מנותק
      א מנותק
      אהרן
      כתב ב נערך לאחרונה על ידי
      #4

      @softs

      אכן js היא שפה מאוד שונה משפות אחרות והמבנה שלה נוח מאוד לעבודה אסינכרונית, צריך ללמוד לחיות עם זה ולא להילחם בזה.

      תחשוב איך זה כשאני צריך לחפש מילה ואם לא מוצא לנסות בוירואציות שונות, וכל זה באסינכרוני :shock:

      פורסם במקור בפורום CODE613 ב06/09/2015 09:18 (+03:00)

      תגובה 1 תגובה אחרונה
      0
      • dovidD מנותק
        dovidD מנותק
        dovid ניהול
        כתב ב נערך לאחרונה על ידי
        #5

        אהרון, אני לא מבין מה הבעיה. אולי בגלל שאני לא יודע מה זה get.post? תוכל להביא לי דוקומנטציה על החיה הזו או דוגמה?

        פורסם במקור בפורום CODE613 ב06/09/2015 10:44 (+03:00)

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        תגובה 1 תגובה אחרונה
        0
        • א מנותק
          א מנותק
          אהרן
          כתב ב נערך לאחרונה על ידי
          #6

          http://expressjs.com/guide/routing.html
          אבל זה החלק השולי
          get.post זו הוראה לשרת ליצור כתובת
          לכתובת הזו ajax שולח את הבקשה ומקבל תשובה.

          עכשיו כש-ajax בקלינט פונה לשרת, השרת מבצע פעולה על הנשלח ומחזיר
          ואם הפעולה הזאת קוראת לפעולה אחרת אי סינכרונית, הפונקציה נגמרת ולא מחזירה כלום לקלינט שממתין לתשובה.

          בסוף, אחרי ים זמן, ועזרה מאנשים טובים
          אחרי קבלת הדאטה מהקלינט, אני קורא לפונקציה האי סינכרונית ומיד מקים האזנה לארוע (כשהארוע יקרה תישלח תשובה), והפונקציה האי סינכרונית מפעילה את הארוע הזה.

          זהו, אני קירח....

          פורסם במקור בפורום CODE613 ב06/09/2015 10:56 (+03:00)

          תגובה 1 תגובה אחרונה
          1
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #7

            לא הבנתי כל כך.
            מה הבעיה בסגנון הזה:

            app.post("/", function (req, res) {
              getDataFromDB('word', res);
            });
            
            
            function getDataFromDB(word, res) {
                db.get(word, function (err, value) {
                if (err) res.status(404).send('Not found'); 
                res.send(value);
              });
            }
            

            תגיד, הget שאתה כותב get.post הוא מחזיק את הסרבר? מה שמקובל לקרוא app? לא נראה לך קצת מבלבל?

            פורסם במקור בפורום CODE613 ב06/09/2015 11:45 (+03:00)

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            0
            • א מנותק
              א מנותק
              אהרן
              כתב ב נערך לאחרונה על ידי
              #8

              @דוד ל.ט.

              לא הבנתי כל כך.
              מה הבעיה בסגנון הזה:

              app.post("/", function (req, res) {
                getDataFromDB('word', res);
              });
              
              
              function getDataFromDB(word, res) {
                  db.get(word, function (err, value) {
                  if (err) res.status(404).send('Not found'); 
                  res.send(value);
                });
              }
              

              נסיתי ככה ועבד מצוין
              הבעיה היא שאני משתמש בעוד נתונים שבאים ב-req והתווספו עוד ועוד ארגומנטים
              אז כבר היה עדיף להעביר גם את req וגם את res, אבל אז כבר לא נשאר הגיון לחלוקה
              ככה יש קובץ app וקובץ DBmanual
              (זה גם עונה על השאלה השניה שלך)
              פשוט צריך להתרגל, אבל זה דומה
              את המשך הפונקציה אני מכניס לתוך .on
              ובפונקציה שמחפשת את המילה במקום return כותבים event.emit...

              הא, והיתה סיבה נוספת לבלגן
              הpost מקבל קטע שלם ואני מריץ לולאה על כל מילה ואוגר ואז מחזיר

              עכשיו אני מסתבך במיוחד
              אם המילה לא נמצאת במילון, אני מחפש אותה בעוד ווירואציות
              לדוגמא אם לא מוצא "לדעת" אז הוא מזהה שלמ"ד זו אות צמוד ומחפש "דעת" ואז יודע לחבר, יש המון אפשרויות כאלו, ובשביל זה צריך לבדוק הרבה פעמים, כל אפשרות אם נמצאת במילון ואם לא להמשיך לנסיונות הבאים.
              ובכל זה לבצע באי סינכרוני וקולבקים.
              :roll:
              אבל יש פתרונות, אין ספק.

              פורסם במקור בפורום CODE613 ב06/09/2015 12:19 (+03:00)

              תגובה 1 תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                כתב ב נערך לאחרונה על ידי
                #9

                אתה צריך לשנות את החשיבה. מה שאתה מעלה זה בכלל לא חסרונות של 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.

                פורסם במקור בפורום CODE613 ב06/09/2015 13:03 (+03:00)

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                תגובה 1 תגובה אחרונה
                1
                • S מנותק
                  S מנותק
                  softs
                  כתב ב נערך לאחרונה על ידי
                  #10

                  @אהרן

                  @softs
                  אכן js היא שפה מאוד שונה משפות אחרות והמבנה שלה נוח מאוד לעבודה אסינכרונית, צריך ללמוד לחיות עם זה ולא להילחם בזה.

                  אני ממתין לך בסבלנות
                  ואתה בורח אחרי שורה אחת?
                  😮
                  🙂

                  אז עכשיו אנשים "בונים" עלי שאני יענה? מלחיץ קצת כי אני די מרגיש בור בהרבה דברים...
                  אני פשוט זוכר את עצמי מנסה להילחם באסינכרוניות ומכלה את כוחותי לריק אז נתתי עצה טובה.
                  לגבי השאלה הספציפית לא העמקתי בענין, ומי לנו גדול מדוד ל.ט. שכבר נראה שלן בעומקה של שאלתך והשקיע מזמנו ללמוד את הנושא במיוחד!
                  הלוואי על כולנו...
                  אגב ל jquery יש אופציה ל AJAX סינכרוני שמשתמש באובייקט הגנרי של JS (http://stackoverflow.com/questions/3481970/how-does-jquerys-synchronous-ajax-request-work)

                  פורסם במקור בפורום CODE613 ב06/09/2015 13:44 (+03:00)

                  תגובה 1 תגובה אחרונה
                  2
                  • א מנותק
                    א מנותק
                    אהרן
                    כתב ב נערך לאחרונה על ידי
                    #11

                    @דוד ל.ט.

                    אתה צריך לשנות את החשיבה. מה שאתה מעלה זה בכלל לא חסרונות של 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.

                    עוד לא ישנתי משבת.. אז עוד אתעמק בתשובתך
                    בנתיים מה שעולה לי מיד

                    1. ה-DB המדובר מקבל רק שאילתות אי סינכרוניות.
                    2. בגלל שפונקציה אי סינכרונית בתוך לולאה עלולה לגרום לשגיאות (סבירות גבוהה לפי חבר מאוד מוערך פה) אז השתמשתי במודול שנבנה בשביל זה
                      https://github.com/caolan/async#each

                    הקוד נראה בנתיים כך

                    exports.getNikudEvent = function ( words, ee ) {
                    
                      var nikudim = [];
                      if( typeof words == 'string' ) words = words.split();
                      var cnt = -1
                    
                      async.each(words, function(word, next){
                        db.get(word,function (err, value) {
                          cnt++
                          if (err) {
                            console.log('Ooops cnot get nikud for: ', word) ;
                          }
                          if (value) value = value.split(',');
                          nikudim.push(value);
                            next();
                          });
                        }
                        ,
                        function() {
                          ee.emit("sendAjax", nikudim);
                        }
                      );
                    };
                    
                    app.post('/getajax', function( req , res) {
                      var words =    req.body.sendWord;
                      var indexElm = req.body.indexElm;
                    
                        db.getNikudEvent(words, ee);
                    
                        ee.once("sendAjax", function (nikudim) {
                    
                    	  	var obj = { nikudim: nikudim, indexElm: indexElm };
                    
                        	res.send(obj);
                        });
                    });
                    

                    אין לי מילים להודות לך!!

                    פורסם במקור בפורום CODE613 ב06/09/2015 14:25 (+03:00)

                    תגובה 1 תגובה אחרונה
                    0
                    • א מנותק
                      א מנותק
                      אהרן
                      כתב ב נערך לאחרונה על ידי
                      #12

                      @softs

                      @אהרן
                      @softs
                      אכן js היא שפה מאוד שונה משפות אחרות והמבנה שלה נוח מאוד לעבודה אסינכרונית, צריך ללמוד לחיות עם זה ולא להילחם בזה.

                      אני ממתין לך בסבלנות
                      ואתה בורח אחרי שורה אחת?
                      😮
                      🙂

                      אז עכשיו אנשים "בונים" עלי שאני יענה? מלחיץ קצת כי אני די מרגיש בור בהרבה דברים...
                      אני פשוט זוכר את עצמי מנסה להילחם באסינכרוניות ומכלה את כוחותי לריק אז נתתי עצה טובה.
                      לגבי השאלה הספציפית לא העמקתי בענין, ומי לנו גדול מדוד ל.ט. שכבר נראה שלן בעומקה של שאלתך והשקיע מזמנו ללמוד את הנושא במיוחד!
                      הלוואי על כולנו...
                      אגב ל jquery יש אופציה ל AJAX סינכרוני שמשתמש באובייקט הגנרי של JS (http://stackoverflow.com/questions/3481970/how-does-jquerys-synchronous-ajax-request-work)

                      אם הבנתי נכון מדובר רק על האם להמתין לתשובה מבלי להמשיך בקוד
                      ולכן זה עלול להקפיא את הדפדפן לדקות ארוכות (עד שמגיעה תשובה),
                      ואם אני מבין נכון, זה בכל מקרה לא ישפיע על פונקציות אי סינכרוניות שהשרת קורא להם ואין לajax שום שליטה עליהם.

                      פורסם במקור בפורום CODE613 ב06/09/2015 21:43 (+03:00)

                      תגובה 1 תגובה אחרונה
                      0
                      • א מנותק
                        א מנותק
                        אהרן
                        כתב ב נערך לאחרונה על ידי
                        #13

                        @דוד ל.ט.

                        אתה צריך לשנות את החשיבה. מה שאתה מעלה זה בכלל לא חסרונות של JS, בנו אותו דוקא לזה.
                        באמת נראה לי ששאילתות כמו שלך מDB לא כדאי לבצע אסינכרוני, כי אתה לא רוצה תוצאה של כל הקודם זוכה אלא לפי הסדר (המילה מקורית ורק אח"כ וריאציה א' ורק אח"כ וריאציה ב').
                        כשרוצים לעשות לפי סדר בJS הכי טוב זה להשתמש עם רשימה. משהו כזה:

                        אני לא באמת חושב שזה חסרון....
                        רוצה ללמוד איך כן מתנהגים עם זה.

                        פורסם במקור בפורום CODE613 ב06/09/2015 22:13 (+03:00)

                        תגובה 1 תגובה אחרונה
                        0
                        • א מנותק
                          א מנותק
                          אהרן
                          כתב ב נערך לאחרונה על ידי
                          #14

                          @דוד ל.ט.

                          במידה ויש לך וריאציות עם אותו עדיפות הכי טוב זה לשלוח אסינכרוני ו"כל הקודם זוכה" ככה אתה מרויח את מעלת הJS.

                          אין לי עדיפות באיזה מילה הוא מטפל קודם
                          אבל אני כן צריך שאת התוצאה הוא יכניס לאותו מיקום במערך, כמו של המילה שמחפשים.

                          בלולאה בסיסית הצלחתי
                          אבל כשנסיתי להוסיף נסיונות נוספים של חיפוש למקרה ולא מוצא
                          לא הצלחתי לשמר את מספר האינדקס.

                          פורסם במקור בפורום CODE613 ב06/09/2015 22:40 (+03:00)

                          תגובה 1 תגובה אחרונה
                          0
                          • א מנותק
                            א מנותק
                            אהרן
                            כתב ב נערך לאחרונה על ידי
                            #15

                            רבי דוד
                            מה עושה
                            func(value)
                            מריץ את הפונקציה שעכשיו רצה (רקורסיה)?

                            שוב אלף תודות!!
                            כתיבה וחתימה טובה לכולם!

                            פורסם במקור בפורום CODE613 ב06/09/2015 22:41 (+03:00)

                            תגובה 1 תגובה אחרונה
                            0
                            • dovidD מנותק
                              dovidD מנותק
                              dovid ניהול
                              כתב ב נערך לאחרונה על ידי
                              #16

                              @אהרן

                              רבי דוד
                              מה עושה
                              func(value)
                              מריץ את הפונקציה שעכשיו רצה (רקורסיה)?

                              לא, אדרבא זה יציאה מרקורסיה. הfunc זה הפרמטר השני, של הפונקציה searchFromDb. זה הcallback לapp.post.

                              אני הכרתי את המחלקה של הasync והיא אכן שימושית מאוד אבל לא נדרשת למקרה שלך שהוא מקרה קלאסי של nodejs. וודאי שאין צורך באיוונטים.

                              פורסם במקור בפורום CODE613 ב07/09/2015 10:06 (+03:00)

                              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                              בכל נושא אפשר ליצור קשר dovid@tchumim.com

                              תגובה 1 תגובה אחרונה
                              1
                              • א מנותק
                                א מנותק
                                אהרן
                                כתב ב נערך לאחרונה על ידי
                                #17

                                אני מנסה טיפה להבין שם מה קורה
                                ורואה שההמרה לבינארי מגיע מכאן

                                Codec               = require('level-codec')
                                

                                אבל אין קובץ כזה
                                אז מאיפה זה נלקח?

                                פורסם במקור בפורום CODE613 ב07/09/2015 14:35 (+03:00)

                                תגובה 1 תגובה אחרונה
                                0
                                • dovidD מנותק
                                  dovidD מנותק
                                  dovid ניהול
                                  כתב ב נערך לאחרונה על ידי
                                  #18

                                  ?!?

                                  פורסם במקור בפורום CODE613 ב07/09/2015 14:43 (+03:00)

                                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                  תגובה 1 תגובה אחרונה
                                  0
                                  • א מנותק
                                    א מנותק
                                    אהרן
                                    כתב ב נערך לאחרונה על ידי
                                    #19

                                    כאן יש הכנסה של הפונקציות לפרוטוטייפ
                                    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)

                                    תגובה 1 תגובה אחרונה
                                    0
                                    • dovidD מנותק
                                      dovidD מנותק
                                      dovid ניהול
                                      כתב ב נערך לאחרונה על ידי
                                      #20

                                      אבל מה זה קשור לנושא האשכול?

                                      פורסם במקור בפורום CODE613 ב07/09/2015 15:27 (+03:00)

                                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                      תגובה 1 תגובה אחרונה
                                      1
                                      • א מנותק
                                        א מנותק
                                        אהרן
                                        כתב ב נערך לאחרונה על ידי
                                        #21

                                        @דוד ל.ט.

                                        אבל מה זה קשור לנושא האשכול?

                                        לא תירוץ מספיק טוב, ובכ"ז..
                                        הגעתי לזה כי חשבתי על פונקציה שמקבלת בget מערך, ומחפש לפי סדר האיברים כל זמן שלא נמצא.

                                        פורסם במקור בפורום CODE613 ב08/09/2015 13:53 (+03:00)

                                        תגובה 1 תגובה אחרונה
                                        0
                                        • dovidD מנותק
                                          dovidD מנותק
                                          dovid ניהול
                                          כתב ב נערך לאחרונה על ידי
                                          #22

                                          תירןץ מציין. אבל הget הזה ככה"נ ממומש בC.

                                          פורסם במקור בפורום CODE613 ב08/09/2015 14:30 (+03:00)

                                          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                          בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                          תגובה 1 תגובה אחרונה
                                          0

                                          • 1
                                          • 2
                                          • 3
                                          בא תתחבר לדף היומי!
                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • דף הבית
                                          • קטגוריות
                                          • פוסטים אחרונים
                                          • משתמשים
                                          • חיפוש
                                          • חוקי הפורום