סדר תהליכים ב java script
-
באג שקורה לי לפעמים כן לפעמים לא.
אני מריץ שתי לולאות for ורוצה שאח"כ את התוצאה שלהם יעדכן במסד נתונים tormim אני מעכב את זה עד להשלמה לפעמים זה שומר לפעמים לא. כלומר לפעמים בכלל זה לא מגיב מדלג על זה. לא מעדכן כלום. איפה אני טועה. אולי איזה תקלה עוצרת את זה מלהגיע לשם?let card= [] let ms; if (truma.hafaka === "מערכת") { for (var i = 0; i < truma.amount ; i++) { let results = await wixData.query("card").eq("sug", "הגרלה").ascending("ms").isEmpty("torem").limit(1).find() let item = results.items[0]; console.log(item); item.torem = truma._id; // updated last name await wixData.update("card", item); console.log(ms); if (ms===undefined) { ms = await item.ms }else{ ms = await ms + "," + item.ms } await card.push(item._id) console.log(results); await wixData.insertReference("tormim", "card", truma._id, results.items[0]._id) .then( () => { console.log("Reference inserted"); } ) .catch( (error) => { console.log(error); } ); } for (var ii = 0; ii < (Math.floor( truma.amount/2)) ; ii++) { let results2 = await wixData.query("card").eq("sug", "בונוס").ascending("ms").isEmpty("torem").limit(1).find() let item2 = results2.items[0]; console.log(item2); item2.torem = truma._id await wixData.update("card", item2); ms = await ms + "," + item2.ms await card.push(item2._id) await wixData.insertReference("tormim", "card", truma._id, results2.items[0]._id) .then( () => { console.log("Reference inserted"); } ) .catch( (error) => { console.log(error); } ); } console.log(ms); await wixData.get("tormim", truma._id) .then((item) => { item.ishur= true item.status = "מאושר" item.card1= ms wixData.update("tormim", item) } ) .catch( (err) => { let errorMsg = err; } ); return ms }
-
@אבי-203 אני לא מבין מה אתה מנסה לעשות בקוד שלך (אתה לא משתמש כלל במשתנה
i
בתוך הקוד, זה בכוונה? משהו נראה מוזר שם).אבל הכלל הגדול הוא:
שימוש ב-await
נצרך/שימושי/משפיע אך ורק כאשר הוא מוחל עלpromise
.
התוצאה שלawait 1 + 1
הוא שווה בדיוק ל-1 + 1
בליawait
.לכן:
await card.push
מיותר להשתמש שם ב-await מכיון שפונקציית push לא מחזירה promise.
אני מניח שגם פה:ms = await item.ms
ה-await מיותר כי מן הסתם המשתנה
ms
הוא לא promise. -
@yossiz מקווה שהבנתי כעת את ההגיון של זה.
אני רוצה שהלולאות יבנו את הערך של הפרמטר ms ורק לאחר שהוא נבנה ירוץ פעולת העדכון.
זה עובד לי טוב מה שכתבתי. אבל לפעמים זה רץ קודם, לא מצליח למצוא את הסיבה.
אני יודע שיש דבר כזה
Promise.all([
אבל כנראה אני לא יודע להשתמש בזה.await wixData.get("tormim", truma._id) .then((item) => { item.ishur= true item.status = "מאושר" item.card1= ms wixData.update("tormim", item) } ) .catch( (err) => { let errorMsg = err; } );
-
@אבי-203 השימוש בasync / await בא במקום השימוש בפונקציה then().
לכן את הקוד שלך אתה צריך לכתוב כך:
await wixData.get("tormim", truma._id); // עכשיו הוא לא יריץ את הקוד הבא, עד שהפונקציה get תסיים // כיון שאתה לא שומר את הערך שחוזר במשתנה, אתה צריך לכתוב ככה: const item= await wixData.get("tormim", truma._id); // עכשיו המשתנה item // יכיל את מה שרצית. item.ishur= true item.status = "מאושר" item.card1= ms // גם בשורה הבאה אתה צריך להוסיף לו await await wixData.update("tormim", item)
-
לפני השימוש ב async / await היו משתמשים בpromise עם then (עדיין אפשר להשתמש בזה, אבל זה לא הולך ביחד..
כשרוצים להשתמש ב then צריך לכתוב ככה:wixData.get("tormim", truma._id) .then(item => { item.ishur= true item.status = "מאושר" item.card1= ms return wixData.update("tormim", item) }) .then(res => { console.log(res) }) .catch(err => console.log(err))
מקווה שזה קצת יעשה לך סדר בדברים האלה