روز 25 (هفته 5) - تفاوت ظریف بین بعدی () و بازگشت بعدی ()

قبل از اینکه به تفاوت بین تماس بعدی () و بازگشت بعدی () بپردازم ، دوست دارم روز را خلاصه کنم.

جمعه نرمال جمعه ما شامل برخی از اطلاعیه ها ، برخی از اطلاعات در مورد خدمات شغلی و برنامه پیشروی و چند ارائه پروژه هایی بود که ما روی آن کار کرده بودیم. فکر این است که با ارائه کد ما در صحبت کردن در مورد کد بهتر می شویم. فکر می کنم این یک کار عالی است که باید انجام دهم ، فقط آرزو می کنم زمان بیشتری برای انجام این کار داشته باشیم. یکی از پیشنهادات من به جلو این است که ما بررسی های رسمی بیشتری در Github داریم تا با استفاده از همان ابزارهایی که به احتمال زیاد در محل کار برای بررسی و اظهارنظر در مورد کد افراد دیگر استفاده خواهیم کرد ، تمرین کنیم.

من همچنین در مورد رزومه و نامه های سرپوشیده خود برای شرکت هایی که علاقه مند به درخواست آنها هستم ، یک جلسه یک به یک داشتم. همه در مورد روند پیش رو بسیار سازمان یافته و آگاه هستند. می توانم بگویم که تجربه و دانش عمیقی در مورد چگونگی پیدا کردن شغل در توسعه نرم افزار وجود دارد. امید من این است که بتوانم در پایان این آموزش از آن اطلاعات استفاده کرده و از آن برای یافتن شغل استفاده کنم.

خوب ، در مورد تفاوت بین فراخواندن بعدی () و بازگشت بعدی (). من اولین بار این کار را چند روز پیش هنگام کار با برخی از مثال های نمونه در کارهای شبانه متوجه شدم. ما از Express برای تعریف مسیرها استفاده می کنیم و چیزی که من دیدم چیزی شبیه به این بود.

app.get ('/ post') ، عملکرد (req ، res ، بعدی) {
  Post.findById (1234) .the (عملکرد (ارسال ، اشتباه) {
    اگر (اشتباه)
      بازگشت بعدی (اشتباه)؛
    }
    اگر (! پست)
      var notFound = خطای جدید ("ارسال یافت نشد!")؛
      notFound.status = 404؛
      بازگشت بعدی (notFound)؛
    }
    res.send (ارسال)؛
  })؛
})؛

در اینجا ما در حال دستیابی به درخواست GET در مسیر / پست هستیم. در پاسخ به تماس ، به نظر می رسد که ما به نوعی تماس با Post.findById را انجام می دهیم که احتمالاً پرس و جو از پایگاه داده است. زیرا این شامل دستیابی به یک بانک اطلاعاتی و بازگشت یک وعده - که از استفاده از استفاده از آن مشخص است - اجازه دهید داخل این عملکرد باشیم. به طور خاص ، ما می بینیم که اگر (اشتباه) صحیح باشد ، یک تماس برای بازگشت بعدی (اشتباه) انجام می شود. پس از آن ، اگر ((پست)) دیگری داشته باشیم که باز هم برگشت بعدی را انجام می دهد (notFound) ، و در آخر اینکه اگر خطایی را ندیدیم و ارسال برخی از داده ها در آن باشد ، ما به res.send (ارسال) تماس می گیریم که نتیجه را ارسال می کند. جستجوی پایگاه داده به مرورگر باز می گردد.

در مثالهای دیگر ، من چیزی شبیه به این را می دیدم.

app.get ('/ foo' ،
بررسی عملکرد ثبت نام (req ، res ، next) {
  اگر (! req.user.registered) {
    // اگر کاربر ثبت نام نکرده اید ، به مسیر بعدی بروید.
    // getRegistration اجرا نخواهد شد.
    بعدی ("مسیر")
  }
} ، تابع getRegistration (req ، res ، next) {
  Register.find (عملکرد (خطا ، داده))
    اگر (اشتباه) به مرحله بعدی برگردد (اشتباه)
    res.json (داده)
  })؛
})؛

در این مثال ، ما فقط به مرحله بعدی ("مسیر") تماس می گیریم. بنابراین سوال طبیعی این است که تفاوت بین استفاده یا برگشت چیست؟

همانطور که امروز فهمیدم ، تماس با شخص بعدی () در داخل یک مسیر فوراً عملکرد را ترک نمی کند و به مسیر بعدی ادامه می دهد. در این حالت ، باقیمانده مسیر ارزیابی می شود و چون بعدی () فراخوانده شده است ، دیگر نیازی به حل درخواست نیست و ما به سادگی می توانیم به سمت کنترل کننده مسیر تطبیق بعدی حرکت کنیم.

سریع کنار بگذارید: به یاد داشته باشید که اگر درخواست را در مسیری حل نکردید ، Express هیچ چیزی را به مرورگر ارسال نمی کند و به حالت تعلیق در می آیید.

بنابراین ، فراخوانی بعدی () از داخل یک مسیر به Express ساده می گوید که باید باقیمانده مسیر حرکت کند و سپس به مسیر مطابق بعدی حرکت کند.

این را با تماس بازگشت بعدی () از یک مسیر در تضاد قرار دهید. تفاوت بسیار مهم این است که وقتی شما به مرحله بعد () (برگشت) () برگشت می دهید ، بلافاصله عملکرد را ترک می کند و به مسیر مطابق بعدی ادامه می یابد. این شبیه به رفتار پرتاب یک استثنا است. اتفاقی در مسیر ما افتاده است و ما می خواهیم از هر کد باقی مانده در مسیر پرش کنیم و فقط به مسیر مطابق بعدی پرش کنیم.

مسئله من امروز در تلاش برای اجرای یک پرس و جو به MongoDB بود که در آن همه نام کاربری و کلمه عبور من برای برنامه من ذخیره می شود. وقتی به درخواست POST رسیدم ، که نام کاربری و رمز عبوری را که مشتری به تازگی ارسال کرده بود ، دریافت کردم ، باید یک پرس و جو را اجرا کنم تا ببینم سابقه تطبیق در بانک اطلاعاتی وجود دارد یا خیر. این یک تماس ناهمزمان با عملکرد برگشتی است. در مورد Express ، اجرای برنامه من در حالی که منتظر بازگشت نتیجه از پایگاه داده هستیم ، ادامه دارد.

معلوم است که این برای من بد است. از آنجا که Express منتظر بازگشت داده ها از پایگاه داده است ، اجرای آن ادامه دارد و من شروع به دیدن این پیام خطا می کنم.

خطا: نمی توان هدر ها را پس از ارسال تنظیم کرد.

این اکسپرس وقتی ادامه پیدا می کند که من واقعاً نمی خواستم. من وقتی می خواستم از بازگشت بعدی استفاده کنم () از گزینه بعدی استفاده می کردم.

تحقق این موضوع امروز برای من بسیار زیاد بود. خوب است که حلقه باز را از چند روز قبل در تعجب بپرسید که تفاوت این دو تماس چیست. اکنون می توانم برگردم و کد خود را برای این پروژه پاک کنم.

آخرین مورد - پروژه هفتگی جدید امروز منتشر شد. ما باید یک صفحه وب را کد گذاری کنیم که به شما امکان می دهد بازی کلاسیک Hangman را انجام دهید. من این هفته را حل می کنم! :-)