המחשבה שהסיטואציה של ימות המשיח מכניסה אותך למצב ששפת JS לא נותנת פתרון אלגנטי, שגויה לחלוטין. המקרה הזה לא נדיר והגיוני בהמון מצבים.
האפשרות לבדוק רק בסוף אם כל הערכים הגיעו היא ודאי לא אופציה, כפי שאמרת זה לא יעיל ויביא שגיאות.
האפשרות לכתוב שוב ושוב return בפונקציה הקוראת בהתאם לערך החוזר היא בהחלט גם "עבירה", אבל היא עבירה הרבה יותר קלה, למרות שאתה ממש מתנגד לעניין.
האפשרות הנכונה זה לכתוב קוד טוב...
דוגמה שזורמת עם הדרך שלך:
app.get('/xyz', function(req, res){
var data = {};
if(!read(req, res, data, 'f-הקלט את שמך', 'name', VOICE)) return;
if(!read(req, res, data, 't-בחר את הסטטוס האישי, לבחור הקש אחד לאברך הקש שתיים לתתלמיד חיידר הקש שלוש', 'status', MENU + '12')) return;
if (data[status] === '1'){
if(!read(req, res, data, 't-הקלט את שם הישיבה ולסיום הקש סולמית', 'yeshiva', VOICE)) return;
database.insertSQL({'name' : name,'yeshiva' : yeshiva}, 'bachurim').then(id => {
say('t-נרשמת בהצלחה המספר האישי שלך הינו.n-' + id);
})
}
...
}
function read(req, res, data ...){
if(data[name] = req.query[name])
return true;
else
...
}
אבל הרבה יותר טוב היה לממש משהו גנרי לזרימה הזו. אתה טענת באשכול ההוא וגם טענו אחריך בנושא מיוחד שפתחתי עבור זה שזה מידי מסובך. כלומר אתם עסוקים מידי מכדי לחסוך זמן וכח....
הנה דוגמה למשהו גנרי:
app.get('/xyz', function (req, res) {
var flow = {
name: { next: () => ["status"], askUser: `t-בחר את הסטטוס האישי, לבחור הקש אחד לאברך הקש שתיים לתתלמיד חיידר הקש שלוש` /* , ...*/ },
status: {
askUser: `t-הקלט את שם הישיבה ולסיום הקש סולמית`, /* , ... ,*/ next: function (val) {
if (val == "1") return "yeshiva";
if (val == "2") return "isuk";
if (val == "3") return "...";
}
},
yeshiva: { next: null, askUser: `t-הקלט את שם הישיבה ולסיום הקש סולמית` },
isuk: { next: (val) => ({ 1: "kolel", 2: "work" }[val]), askUser: `t-אברך כולל הקש אחד, נהנה מיגיע כפיו הקש שתיים` },
kolel: { next: null, askUser: `t-הקלט את שם הכולל ולסיום סולמית` },
work: { next: null, askUser: `t-הקלט את שם מקום העבודה` },
};
var data = req.query || {};
if (!proccessStep("name")) //all data ready?
return false;
//...
//work with data
if(data[status] == "1"){
database.insertSQL({ 'name': name, 'yeshiva': yeshiva }, 'bachurim').then(id => {
say('t-נרשמת בהצלחה המספר האישי שלך הינו.n-' + id);
})
}
//...
//...
function proccessStep(key) {
if (!data[key]) {
//res.end() ...
return false;
}
var next = flow[key].next(data[key]);
if (next)
return proccessStep(next)
else return true;
}
});
בקוד הזה אתה מעביר לפוקנציה רקורסיבית את הדאגה שכל המידע יתקבל, הזרימה של קבלת המידע מתבצעת בהתאם לאובייקט דקלרטיבי קל לתחזוקה ושינויים.
(הרעיון שהפוקנציה היא בפנים הפונקציה ולא בחוץ היא פרקטיקה נכונה כאשר הפונקציה ייעודית לפונקציה זו או שהיא תלויה בה במידי תלויות, זה עדיף מלהעביר הרבה פרמטרים).
האם הקוד הזה טוב? לא.
יש בו המון מה לשפר, הflow לא חד בתכליתו כי הוא כאילו רק לאסוף מידע אבל בתכלס כל הפעולה זה איסוף מידע אז שגם ישמור בnext האחרון בdb. יש פה עוד הרבה מה להשחיז. אבל תרחמו על עצמכם, תחשבו.