اليوم 25 (الأسبوع 5) - الفرق الدقيق بين التالي () والعائد ()

قبل تلخيص الفرق بين استدعاء التالي () والتالي () ، أريد تلخيص اليوم.

تألفت جمعة الجمعة النموذجية لدينا من بعض الإعلانات والخدمات المهنية وبعض خطط التقدم وبعض العروض التقديمية التي عملنا عليها. من خلال تقديم ملاحظاتنا ، نقوم بتحسين محادثتنا حول الرمز. أعتقد أن هذا أمر جيد ، نود قضاء المزيد من الوقت في هذا. أحد اقتراحاتي للمضي قدمًا هو مراجعة الرموز الرسمية على Github ، لمعرفة كيفية استخدام الأدوات التي نستخدمها لعرض وتفسير رموز الآخرين في مكان العمل.

كان لدي اجتماع واحد لواحد حول سيرتي الذاتية وتقدمت بطلب للحصول على خطابات للشركات التي أردت التقدم لها. الجميع منظمون و مدركون جدا للمضي قدما. يمكنني القول أن لديك خبرة ومعرفة عميقتين بكيفية العثور على وظيفة في تطوير البرمجيات. آمل أن أحصل على هذه المعلومات واستخدامها للعثور على وظيفة في نهاية هذا التدريب.

حول الفرق بين استدعاء التالي () والتالي (()) لاحظت هذا لأول مرة قبل بضعة أيام عند العمل من خلال بعض رموز الواجبات المنزلية الليلية. كان الأمر كذلك.

app.get ('/ post'، function (req، res، next) {Post.findById (1234) .then (function (post، err) {if (error) {return next (err)؛} if (! post ) {var notFound = new Error ('Message not found!')؛ notFound.status = 404؛ return next (notFound)؛} res.send (post)؛})؛}) ؛

نحن هنا ننظر إلى طلب GET على المسار / المشاركة. عند إعادة مكالمة ، يبدو أننا نجري أي مكالمات إلى Post.findById ، وهو على الأرجح استعلام قاعدة بيانات. لأنه ينطوي على ربط قاعدة البيانات وإعادة الوعد. ثم واضح - انظر داخل الوظيفة. على وجه التحديد ، نرى أنه إذا كان (الخطأ) صحيحًا ، فإننا مدعوون للعودة إلى (الخطأ) التالي. ثم لدينا آخر (! Post) ، سيعود (notFound) وأخيرًا res.send (post) ، والذي سيرسل النتيجة إذا لم نرتكب أي أخطاء ويحتوي على بعض المعلومات. ). إعادة طلب قاعدة البيانات إلى المتصفح.

في أمثلة أخرى ، أرى شيئًا مشابهًا.

app.get ('/ foo'، Check CheckRegging (req، res، next) {if (! req.user.registr) {// انتقل إلى المسار التالي إذا لم يكن المستخدم مسجلاً // // getRegration fails. next ('route')}} ، وظيفة getRegistration (req ، res ، next) {Register.find (الوظيفة (خطأ ، بيانات) {if (err) ترجع التالية ( err) res.json (data)})؛})؛

في هذا المثال ، نسمي ببساطة ("المسار"). لذا فإن السؤال الطبيعي هو: ما الفرق بين استخدام العودة؟

كما أعرف اليوم ، فإن المكالمة التالية () داخل المسار لا تترك الوظيفة على الفور ولا تنتقل إلى مسار الرحلة التالي. في هذه الحالة ، يتم تقييم بقية المسار ، وبما أنه يتم استدعاء () التالي ، فلا حاجة لحل الطلب ، وننتقل ببساطة إلى معالج المسار المناسب التالي.

ضع جانبا بسرعة: إذا لم تقم بحل الطلب ضمن المسار ، فتذكر أن Express لا ترسل أي شيء إلى المتصفح وتعلقك.

لذا ، فإن الاتصال برقم () التالي من داخل المسار يخبر Express ببساطة أن بقية المسار بحاجة إلى المتابعة والانتقال إلى المسار المناسب التالي.

قارن هذا باستدعاء () التالي على الطريق. الفرق المهم هو أنه عند استدعاء التالي () ، يترك التنفيذ على الفور الوظيفة ويذهب إلى المسار المطابق التالي. يبدو وكأنه لقطة استثنائية. حدث شيء في مسار الرحلة ، ونريد فقط تخطي الرمز المتبقي على المسار والانتقال إلى المسار المناسب التالي.

كانت مشكلتي هي محاولة إرسال طلب إلى MongoDB ، حيث يتم تخزين جميع اسم المستخدم وكلمة المرور الخاصة بي لتطبيقي. عندما أحصل على طلب POST بأن العميل لديه اسم المستخدم وكلمة المرور المقدمة من قبله ، أحتاج إلى تشغيل الاستعلام لمعرفة ما إذا كان هناك ارتباط في قاعدة البيانات. هذه مكالمة غير متزامنة مع وظيفة رد اتصال. أما بالنسبة لـ Express ، فستستمر في تنفيذ التعليمات البرمجية الخاصة بي ، بانتظار عودتها من قاعدة البيانات.

هذا يعني أنه سيء ​​بالنسبة لي. نظرًا لأن Express تنتظر عودتها من قاعدة البيانات ، فإن التنفيذ قيد التنفيذ وسأبدأ في رؤية رسالة الخطأ.

خطأ: تعذر تثبيت الرؤوس بعد الإرسال

ستستمر هذه السرعة السريعة عندما لا أريدها حقًا. عندما أردت استخدام العودة next () ، استخدمت next ().

لقد كان كبيرًا جدًا بالنسبة لي لأدرك ذلك اليوم. مندهشًا من الفرق بين الجرسين ، ومن الجيد إنهاء الدورة التي افتتحت قبل بضعة أيام. يمكنني العودة الآن ومسح الكود الخاص بي لهذا المشروع.

شيء أخير - خرج مشروع أسبوعي جديد اليوم. نحن بحاجة إلى ترميز صفحة ويب تتيح لك لعب لعبة Hangman الكلاسيكية. سأفعل ذلك في نهاية هذا الأسبوع! :-)