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

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

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. עזרה עם async await

עזרה עם async await

מתוזמן נעוץ נעול הועבר תכנות
28 פוסטים 5 כותבים 641 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY מנותק
    yossizY מנותק
    yossiz
    השיב לdovid ב נערך לאחרונה על ידי yossiz
    #13

    @dovid אמר בעזרה עם async await:

    אתה דבר ראשון "ידעת" שהdb.get זה פרומייז

    לא, כתבתי פונקציה promisifiedDbGet שעוטף את ה-db.get המקורי בפרומייז.

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    dovidD תגובה 1 תגובה אחרונה
    1
    • dovidD מחובר
      dovidD מחובר
      dovid ניהול
      השיב לyossiz ב נערך לאחרונה על ידי dovid
      #14

      @yossiz אם ככה זה נכון ויפה מאוד. בדיעבד @אהרן גילה שזה כבר פרומייז בעצמו, כך שתוכל לפשט עוד יותר.

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

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

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

        @dovid אמר בעזרה עם async await:

        @yossiz אם ככה זה נכון ויפה מאוד. בדיעבד @אהרן גילה שזה כבר פרומייז בעצמו, כך שתוכל לפשט עוד יותר.

        db.get לא מחזיר פרומיס
        בשביל שPromise.all ימתין שכולם יסתיימו, עטפתי את הקירות לdb בפרומיס.

        yossizY תגובה 1 תגובה אחרונה
        0
        • yossizY מנותק
          yossizY מנותק
          yossiz
          השיב לאהרן ב נערך לאחרונה על ידי
          #16

          @אהרן אמר בעזרה עם async await:

          db.get לא מחזיר פרומיס

          באשכול השני כתבת שבלי callback זה מחזיר promise

          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

          א תגובה 1 תגובה אחרונה
          1
          • dovidD מחובר
            dovidD מחובר
            dovid ניהול
            השיב לyossiz ב נערך לאחרונה על ידי
            #17

            @yossiz קראתי, נהדר.
            את הreduce יש להחליף ב.join(''), במקרה הזה מדובר בשרשור פשוט וזה בדיוק התפקיד של Array.join.

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

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

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

              @yossiz אמר בעזרה עם async await:

              @אהרן אמר בעזרה עם async await:

              db.get לא מחזיר פרומיס

              באשכול השני כתבת שבלי callback זה מחזיר promise

              אבל בדוגמא כאן כתבתי עם

              db.get('value', (err, newValue) => {
              
              תגובה 1 תגובה אחרונה
              0
              • א מנותק
                א מנותק
                אהרן
                השיב לdovid ב נערך לאחרונה על ידי
                #19

                @dovid אמר בעזרה עם async await:

                @yossiz קראתי, נהדר.
                את הreduce יש להחליף ב.join(''), במקרה הזה מדובר בשרשור פשוט וזה בדיוק התפקיד של Array.join.

                הוא צודק במידה ורוצים ערך מספרי.

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

                  @dovid
                  אפי' שקראתי שוב ושוב [ושוב], עדיין לא מסכים עם הביקורת שלא קראתי בעיון. לא חשוב.

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

                  השאיפה שלי היתה לא להחזיר את הערך בכל א' משני האפשרויות אלא אחרי כל ההתניה, ועם זאת שימתין לעדכון הא-סינכרוני (רק בתנאי שמתבצע עדכון א-סינכרוני)
                  לכן עטפתי את הפונקציה העדכון הא-סינכרוני עם פרומיס לתוך Promise.all עם הקידומת await ע"מ שכל מה שאחרי העדכון (החזרת הערך) ימתין לסיום כל העדכונים. את הערכים שחזרו מהפרומיס'ס אני לא צריך.

                  async function getValue() {
                  	let value = 0;
                  	let keyes = ['cow', 'deer'];
                  	
                  	if(any_condition) {
                  		await Promise.all( keyes.map( row => {
                  			return new Promise((reslove) => {
                  				db.get('value', (err, newValue) => {
                  					if(err)	console.log(err);
                  					
                  					value += newValue;
                  					reslove();
                  				});
                  			});
                  		}));
                  	}
                  	return new Promise().reslove(value);
                  }
                  

                  הטעות שמעלה את השגיאה היא

                  return new Promise().reslove(value);
                  

                  והיא שגויה גם אם נכתוב אותה כפי שמחזירים reslove באופן תקין, כך

                  return Promise().reslove(value);
                  

                  ככל שאני מבין את הסיבה, כיון ש-async function תמיד מחזירה את הערך עם מתודת then (זה לא נקרא שהיא מחזירה פרומיס??)
                  ואילו אם נחזיר פרומיס, יוצא כאילו אנחנו כותבים כך

                  reslove(Promise().reslove(value))
                  

                  או משהו דומה, שזה שגוי.

                  כפי ש @dovid כתב:

                  טעות בהבנה, פונקציית await לא אמורה להחזיר פרומייז אלא ערך ישיר.

                  ואשלים: אבל רק במידה והוא מקבל פרומיס (=ערך שחוזר מפונקצית פרומיס) הוא יודע להמתין לקבלת ערך א-סינכרורי.

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

                  שוב תודה ל @dovid @zvizvi @yossiz על הדוגמאות וההסברים המושקעים ומפורטים!

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

                    @אהרן לא הבנתי כל מה שאתה כותב, אבל השגיאה שאתה מקבל הוא פשוט שה-constructor של Promise אמור לקבל פונקציה שעושה את ה-resolve או reject,

                    הודעת השגיאה מאוד מובנת, Promise resolver undefined is not a function
                    פי', promise resolver זה הפונקציה שהיית אמור לספק ל-constructor
                    undefined, - מכיון שלא סיפקת פונקציה, אז הפרמטר קיבלה את ה(אי-)ערך undefined
                    is not a function - הוא לא פונקציה

                    מה שהתכוונת לכתוב זה זה:

                    return Promise.resolve(value)
                    

                    בלי הקריאה ל-constructor
                    זו פונקציה שמחזירה promise שהוא כבר במצב resolved עם הערך - value

                    זה שווה לזה:

                    return new Promise(resolve=>resolve(value));
                    

                    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

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

                      @yossiz אמר בעזרה עם async await:

                      return Promise.resolve(value)

                      להחזיר

                      return Promise.resolve(value)
                      

                      במקרים אחרים, זה לא שגיאה

                      yossizY תגובה 1 תגובה אחרונה
                      0
                      • yossizY מנותק
                        yossizY מנותק
                        yossiz
                        השיב לאהרן ב נערך לאחרונה על ידי yossiz
                        #23

                        @אהרן אמר בעזרה עם async await:

                        להחזיר

                        return Promise.resolve(value)
                        במקרים אחרים, זה לא שגיאה

                        אתה קובע או שואל?

                        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

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

                          @yossiz אמר בעזרה עם async await:

                          @אהרן אמר בעזרה עם async await:

                          להחזיר

                          return Promise.resolve(value)
                          במקרים אחרים, זה לא שגיאה

                          אתה קובע או שואל?

                          מספר עובדה.

                          dovidD תגובה 1 תגובה אחרונה
                          0
                          • dovidD מחובר
                            dovidD מחובר
                            dovid ניהול
                            השיב לאהרן ב נערך לאחרונה על ידי
                            #25

                            כשמגיבים בפורום אמור להיות לתגובה ניגון כל שהוא: שאלה/קריאה/ויכוח/הסתייגות.
                            אחרת זה משרה תחושה של בלבול.

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

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

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

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

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

                                @חוקר אמר בעזרה עם async await:

                                לעבוד עם פרומיס או לעבוד עם await ולכתוב את הקוד לאחריו.

                                await זה פרומיס מאחורי הקלעים, רק עם סינטקס נוח יותר.

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

                                  אני ממליץ לעבוד עם async\await, אם בכלל, רק אחרי שליטה והבנה של פרומייז, כי אחרת נהיה בראש חוסר בהירות.

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

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

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

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

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

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