עזרה עם async await
-
@אהרן לא הבנתי אותך אבל אתה בודאי לא הבנת אותי.
אין היגיון (אם לא סיבה נדירה ממש) להחזרת פרומייז בפונקציית await, זה שילוב סגנונות קוד שונים. תוכל לראות בדוגמת הקוד שלי את שתי הדרכים, כל אחת בפוקנציה נפרדת.
async וawait זה נטו נטו סגנון קוד, אין לזה שום מעלה אחרת. בשביל המתנה משתמשים בפרומייז בדיוק באותה המידה של הawait. -
@dovid אמר בעזרה עם async await:
בשביל המתנה משתמשים בפרומייז בדיוק באותה המידה של הawait.
איך אני כותב א"ז בפרומיס
אם יש לי התניהif(...) { update from async function } return value
כך?
if(...) { update from async function reslove(value) } reslove(value)
א"כ רציתי להימנע מלהפעיל את reslove בנפרד ל-2 האפשרויות (משפט מאוד).
-
@dovid אמר בעזרה עם async await:
@אהרן לא הבנתי אותך אבל אתה בודאי לא הבנת אותי.
נירגע שניה מחלוקת הציונים ונדון ענינית.
אין היגיון (אם לא סיבה נדירה ממש) להחזרת פרומייז בפונקציית await, זה שילוב סגנונות קוד שונים. תוכל לראות בדוגמת הקוד שלי את שתי הדרכים, כל אחת בפוקנציה נפרדת.
async וawait זה נטו נטו סגנון קוד, אין לזה שום מעלה אחרת. בשביל המתנה משתמשים בפרומייז בדיוק באותה המידה של הawait.ההגיון ימצא במידה ורוצים לעשות לתשובה .then()
-
-
@yossiz אמר בעזרה עם async await:
@אהרן אמר בעזרה עם async await:
db.get לא מחזיר פרומיס
באשכול השני כתבת שבלי callback זה מחזיר promise
אבל בדוגמא כאן כתבתי עם
db.get('value', (err, newValue) => {
-
@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 על הדוגמאות וההסברים המושקעים ומפורטים!
-
@אהרן לא הבנתי כל מה שאתה כותב, אבל השגיאה שאתה מקבל הוא פשוט שה-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));
-
@yossiz אמר בעזרה עם async await:
@אהרן אמר בעזרה עם async await:
להחזיר
return Promise.resolve(value)
במקרים אחרים, זה לא שגיאהאתה קובע או שואל?
מספר עובדה.
-
מבלי להיכנס לכל הנידון כאן שעדיין לא הצלחתי להתרכז להבין מי נגד מי, אבל משהו אחד הצלחתי להבין שיש אפשרות ליצור פונקציה async עם שימוש await.
ברצוני להבין לשם ההבנה, כאשר אין לי עדיפות לפרומיס, (שעדיין לא הצלחתי להתרכז להבין את זה), אלא בסך הכל אני צריך לשלוף נתונים מSQL למשל, ולבצע פעולות על פי זה.
האם יש עדיפות מבחינה תקנית או קלילות, לעבוד עם פרומיס או לעבוד עם await ולכתוב את הקוד לאחריו.