יום 25 (שבוע 5) - ההבדל העדין בין הבא () לחזרה ()

לפני שאני מסכם את ההבדל בין קריאה הבאה () לזו הבאה (), אני רוצה לסכם את היום.

הפטפטת השישי הטיפוסית שלנו כללה כמה מודעות, שירותי קריירה, ומידע צופה פני עתיד וכמה מצגות שעבדנו עליהן. על ידי מתן משוב אנו משפרים את השיחה שלנו לגבי הקוד. אני חושב שזה דבר טוב, נשמח לבלות יותר זמן בזה. אחת ההצעות שלי להתקדם היא לסקור קודים רשמיים ב- Github, ללמוד כיצד להשתמש בכלים בהם אנו משתמשים כדי להציג ולפרש את הקודים של אנשים אחרים במקום העבודה.

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

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

app.get ('/ פוסט', פונקציה (req, res, next) {Post.findById (1234). ואז (פונקציה (הודעה, שגיאה) {if (שגיאה) {חזור הבא (שגיאה);} if (! הודעה) ) {var notFound = שגיאה חדשה ('הודעה לא נמצאה!'); notFound.status = 404; חזור הבא (notFound);} res.send (הודעה);});});

כאן אנו בוחנים בקשת GET על המסלול / הפוסט. בעת החזרת שיחה נראה כי אנו מבצעים שיחות כלשהן ל- Post.findById, יתכן ובקשת מסד נתונים. מכיוון שזה כרוך בקישור למאגר והחזרת ההבטחה. ואז ברור - התבונן בפונקציה. באופן ספציפי, אנו רואים שאם (שגיאה) נכונה, אנו נקראים לחזור למצב הבא (שגיאה). ואז יש לנו הודעה אחרת (! הודעה), היא תחזור (notFound) ולבסוף תשלח מחדש (הודעה), שתשלח את התוצאה אם ​​לא טעינו, והיא מכילה מידע כלשהו. ). להחזיר את בקשת בסיס הנתונים לדפדפן.

בדוגמאות אחרות הייתי רואה משהו דומה.

app.get ('/ foo', בדוק CheckRegging (req, res, next) {if (! req.user.registr) {// עבור לנתיב הבא אם המשתמש אינו רשום // // getRegration נכשל. הבא ('מסלול')}}, פונקציית getRegistration (req, res, next) {Register.find (פונקציה (שגיאה, נתונים) {אם (שגיאה) חזור הבא ( שגיאה) res.json (נתונים)});});

בדוגמה זו אנו פשוט קוראים ('מסלול'). אז השאלה הטבעית היא: מה ההבדל בין שימוש בתמורה?

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

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

לכן, קריאה למספר הבא () מתוך המסלול פשוט אומרת להביע כי שאר המסלול צריך להמשיך ולעבור למסלול המתאים הבא.

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

הבעיה שלי הייתה ניסיון לשלוח בקשה ל- MongoDB, שם כל שם המשתמש והסיסמה שלי מאוחסנים עבור האפליקציה שלי. כשאני מקבלת בקשת POST שללקוח יש את שם המשתמש והסיסמה המסופקים על ידו, אני צריך להריץ את השאילתה כדי לראות אם יש קישור במסד הנתונים. זוהי שיחה אסינכרונית עם פונקציית התקשרות חוזרת. באשר לאקספרס, הוא ימשיך לבצע את הקוד שלי, בהמתנה לחזרתו מהמאגר.

זה אומר שזה רע לי. בזמן שהאקספרס מחכה לחזור מהמאגר, הביצוע מתבצע ואני אתחיל לראות את הודעת השגיאה.

שגיאה: לא ניתן להתקין כותרות לאחר ההגשה.

המהירות המהירה הזו תמשיך כשאני ממש לא רוצה אותו. כשרציתי להשתמש בחזרה הבאה (), השתמשתי בהמשך ().

זה היה גדול מכדי להבין את זה היום. נדהם מה ההבדל בין שני הפעמונים, ונחמד לסיים את המחזור שנפתח לפני מספר ימים. אני יכול לחזור עכשיו ולנקות את הקוד שלי לפרויקט זה.

דבר אחרון - פרויקט שבועי חדש יצא היום. עלינו לקודד דף אינטרנט שמאפשר לכם לשחק את המשחק הקלאסי של האנגמן. אני אעשה את זה בסוף השבוע! :-)