תכנון נכון של קוד ארוך
-
יש לי קוד של ניהול משתמש (טלפוני) לאורך השימוש בשלוחה.
כרגע זה נראה כך (דוגמא):
האובייקט
call
מנהל את השיחה, ומשמיע למשתמש מה שצריך וכו'.class run { constructor(call) { this.call = call; } async start() { await this.get_var(); } async get_var() { let massage = [{ type: "text", data: "123" }]; let option = { max: 10, val_name: "txt" }; r = await this.call.read(massage, _, option); await this.play(r); } async play(r) { switch (r) { case "value": this.set_val(); break; case "value2": this.set_val2(); break; default: this.get_var(); break; } } async data() { //... } //... } const call = { /* ... */ }; const r = new run(call); r.start();
יש דרכים אחרות לארגן קוד ארוך עם מליון IF's הפנייות וכו'?
אולי יש קישורים להדרכות איך בונים קוד כזה.
-
תלוי מה המקרה, אבל לפעמים אפשר גם לממש עם המסד נתונים. זאת אומרת שלעשות טבלת רשימת פונקציות במסד הנתונים (או יותר טוב טבלת קבוצות פונקציות), ועוד שדה 'get-value' שבו אמור להיות ההקשה המתקבלת מהקליינט וכאשר הפונקציה המבוקשת תסונן לפי השדה.
ואפשר לממש את זה גם אם יש היררכיה של הקשות (תפריט ותפריט משנה
1-2-1 , 1-2-2
) ע"י שבשדה 'get-value' יהיה כתוב 1-2-1, וכן 1-2-2
-
@MusiCode אמר בתכנון נכון של קוד ארוך:
לא מסתדר לי השם של המחלקה, run אמור להיות שם של מתודה לא של קלאס
בשורה 16 איתחלת משתנה בלי let, נראה לי שבתקן החדש זה שגיאת קומפילציה, וגם אם לא זה הופך להיות משתנה גלובלי וזה יצור לך התנגשויות
עוד משהו שאני לא בטוח אבל כך זכור לי, אם המתודות לא מחזירות את הפרומיס, לא יעזור שהם עם await כי כשאתה קורא להם ממתודה אחרת המתודה השניה תמשיך לרוץ, צריך להחזיר את הערך של הפרומיס ובמתודה הקוראת להשתמש ב thenיש דרכים אחרות לארגן קוד ארוך עם מליון IF's הפנייות וכו'?
לא הבנתי איפה יש מליון איפ והפנייות זה נראה מתוכנן בסדר
-
@יוסף-בן-שמעון אמר בתכנון נכון של קוד ארוך:
לא מסתדר לי השם של המחלקה, run אמור להיות שם של מתודה לא של קלאס
זה הדגמה שכתבתי ברגע.
בשורה 16 איתחלת משתנה בלי let, נראה לי שבתקן החדש זה שגיאת קומפילציה, וגם אם לא זה הופך להיות משתנה גלובלי וזה יצור לך התנגשויות
כנ"ל
עוד משהו שאני לא בטוח אבל כך זכור לי, אם המתודות לא מחזירות את הפרומיס, לא יעזור שהם עם await כי כשאתה קורא להם ממתודה אחרת המתודה השניה תמשיך לרוץ, צריך להחזיר את הערך של הפרומיס ובמתודה הקוראת להשתמש ב then
לא נכון. זה תגלית מאוד גדולה שלי.
פונקציית ASYNC מחזיקה בכ"מ פרומיס.
לפעמים לא צריך לפתוח אובייקט פרומיס חדש. זה קורה לבד.יש דרכים אחרות לארגן קוד ארוך עם מליון IF's הפנייות וכו'?
לא הבנתי איפה יש מליון איפ והפנייות זה נראה מתוכנן בסדר
כן, רק שזה אמור להיות בכפול שמונה...
זה הדרך הכי טובה?
-
@MusiCode אמר בתכנון נכון של קוד ארוך:
לא נכון. זה תגלית מאוד גדולה שלי.
פונקציית ASYNC מחזיקה בכ"מ פרומיס.
לפעמים לא צריך לפתוח אובייקט פרומיס חדש. זה קורה לבד.תסביר מה אתה מתכוין, מחלקה כזו:
class Class{ run(){ this.do() console.log("finish") } async do(){ await new Promise(resolve => { setTimeout(()=>{ console.log("start"); resolve() }, 1) }) } } new Class().run()
תדפיס את הפיניש לפני הסטרט, בגלל שהמתודה לא מחזירה פרומיס
-
@יוסף-בן-שמעון אמר בתכנון נכון של קוד ארוך:
תדפיס את הפיניש לפני הסטרט, בגלל שהמתודה לא מחזירה פרומיס
הפוך, בגלל שהיא מחזירה פרומיס ולא רצה סינכרוני
פונקציית async תמיד מחזירה פרומיס.console.log((async _=> 1)()) // Promise {<resolved>: 1}
-
@yossiz אגב, איך יוצרים פונקציה שרצה אסינכרוני (קולבק למשל)?
רק באמצעות פרומיס שלא ימומש?
async function callback() { await new Promise((resolve) => { setTimeout(() => resolve(), 0); }) console.log("finish!"); } (function call() { callback(); // אין המתנה לפרומיס console.log("start..."); })();
או שכל פונקציה היא בחזקת קולבק?
function callback() { setTimeout(() => console.log("finish!"), 0); } (function call() { callback(); // אין המתנה לפרומיס console.log("start..."); })();
(הבעיה שטיים-אאוט זה לא דוגמה טובה, כי המיקום שלו בלולאת האירועים הוא לא המיקום האמיתי שלו.
אבל היה לי איזה נפק"מ אחר, לא זוכר כרגע).