What is the relationship between promises and callbacks
تعریف : Promises ها یا همان وعده ها شی هایی در جاوا هستند که توصیف میکنند زمانی که یک عملیات مبتنی بر زمان ایجاد شود ، چه اتفاقی رخ دهد. آنها callbacks را تکمیل کرده و ساختار و تضمین خاصی را فراهم میآورند که کمک میکنند تا کد ناهمگام را کمی قابل اعتمادتر و سادهتر کند. اول نگاهی به این که callback چیست میاندازیم. یک callback چیزی بیش از یک تابع به عنوان یک آرگومان نیست، بنابراین این بخش در اینجا چیزی است که ما به عنوان یک callback اشاره میکنیم.
در این حالت ما آن را یک تابع میگوییم، تابعی که هیچ نامی ندارد، بنابراین در واقع یک تابع ناشناس است. ما میتوانیم به راحتی یک تابع دیگر را که در جایی دیگر ایجاد کردهایم، فراخوانی کنیم. Callbacks ها در رویداد های غیر همزمان مشترک هستند. وقتی اتفاق میافتد که اتفاق دیگری رخ دهد، در این مثال اینجا ، هر زمان که یک رویداد کلیک صورت میگیرد اجرا می شود. در حال حاضر، مشکلات کمی با callbacks ها وجود دارد. نکته قابلتوجه این است که کد callback اغلب از وضوح رنج میبرد. از همه مهمتر، callbacks ها میتواند عدم اطمینان ایجاد کنند که کد داخل آنها در برخی مواقع و در زمان خاصی اجرا شوند .
در حال حاضر، Promise ها تعدادی از ویژگیها و اقدامات حفاظتی دیگری از جمله تضمین اجرا را فراهم میکنند و این بدان معنی است که callback و Promise هرگز قبل از تکمیل حلقه رویداد جاری فراخوانده نخواهند شد. هم چنین Promise تنها یکبار حل خواهند شد. آن نمیتواند بیش از یکبار موفق یا شکست بخورد و اگر Promise موفق شود یا شکست بخورد، آن را تصحیح میکند حتی اگر این اتفاق قبلا رخ داده باشد. Promise طوری طراحی شده اندکه به راحتی از خاصیت زنجیره وار بودن استفاده کنند.
نتیجه یک عملیات میتواند به شروع یک عملیات دیگر منجر شود. اگر شما تعهدات زنجیرهای انجام دهید و در جایی در امتداد خط یک اشتباه وجود داشته باشد، Promise توقف خواهد کرد که یک مزیت بزرگ Promise ها در برابر callback ها است.
بنابراین نگاهی به یک مساله سنتی میاندازیم که وقتی سعی در استفاده از callback ها و رویداد های غیر همزمان داریم چه اتفاقی می افتد . در این مورد ما یک درخواست ajax را در اینجا انجام میدهیم و نتایج را در این متغیر به نام artists میگذاریم، و سعی داریم تا در این 2 جا print کنیم . بنابراین یکی از این 2 کار نخواهد کرد و اگر نگاهی به کنسول بیندازیم بهتر متوجه میشویم ، من در کروم هستم پسinspect را بازی خواهم کرد و وارد تب console می شوم .
متوجه میشیم که یکی از این نتایج چاپی یک متغیر را به عنوان یک مقدار نامعلوم چاپ میکند و در واقع در این پایین اتفاق میافتد. مشکل این است که ما درخواست ajax را در اینجا داریم، اما قبل از اینکه درخواست ajax بارگیری را تمام کند، ما در واقع سعی در خروجی این متغیر داریم و این متغییر هنوز وجود ندارد و این یک مشکل است زیرا گاهی اوقات میخواهیم مطمئن شویم کاری بعد از تمام شدن یک کار دیگه انجام بشه . و در این مثال بعد از دستور ajax است .
بنابراین، ما میتوانیم با انجام Promise این کار را انجام دهیم. کاری که باید انجام دهیم این است که در اینجا برای ایجاد Promise جدید از کلمه Return استفاده کنیم . این قالبی است که ما برای Promise خود استفاده میکنیم و سپس در اینجا باید از یک callback استفاده کنیم، و درون این callback ما میخواهیم از دو روش استفاده کنیم ، یک " Resolve " و دیگری را "Reject" قرار می دهیم.
هر چیزی که شما در اینجا درخواست میکنید اگر به درستی کار کند وارد " Resolve " میشه و " Reject " هم زمانی که یک اتفاقی مانع از اجرای درست کد ها بشه . تمام این کد را انتخاب میکنیم و وارد promise میکنیم . و به جای اتصال این قسمت به یک متغییر ، از متد Resolve استفاده میکنیم . هر زمان متد Resolve اتفاق بیوفته ، عملیان JASON ما اجرا میشه و اطلاعات دریافت میشه .
حالا جلوتر میریم و این خط را حذف میکنیم ، چون ما دیگر نمیخواهیم آن را در اینجا چاپ کنیم. بنابراین، حالا ما میتوانیم از promise زمانی که سعی داریم این دادهها را دریافت کنیم استفاده کنیم ، بنابراین از Then استفاده میکنیم تا تنها در صورتی اجرا شود که Promise با موفقیت اجرا شود. ما میخواهیم از یک callback در اینجا استفاده کنیم ، و هر داده ای که اینجا دریافت کنیم رو از متد Resolve استفاده و داخل این متغیر Data ذخیره کنیم . و حالا میتونیم از کد کنسول در داخل این قسمت استفاده کنیم برای به نمایش دادن داده ها . و دیگه لازم نیست از متغیر artist استفاده کنیم ، چون تمام اطلاعات داخل Data هست . خب فایلمون رو ذخیره میکنیم و وقتی صفحه رو تازه سازی (Refresh) میکنیم میبینیم که به درستی اطلاعات رو نشون میده . اینجا با این روش آشنا شدیم که چه طور از promise استفاده کنیم تا کاری رو بعد از تمام شدن یک کار دیگه انجام بدیم ، و از Resolve و Reject به درستی استفاده کنیم . و اگه مایل باشین کار دیگه ای بعد از به درستی اجرا شدن Promise انجام بشه به به این شکل از یک دستور Then دیگه استفاده میکنیم و برای مثال پیام Finish رو به Console ارسال میکنیم .
این دلیل خوبی است که ما میتوانیم در حال حاضر یک کد را بیرون از آن انجام دهیم. آنچه معمولا اتفاق میافتد این است که ما همه این کدها را در اینجا قرار میدهیم، اما در حال حاضر ما میتوانیم همه چیز را به ترتیب اجرا کنیم و اطمینان حاصل کنیم که آنها فقط در نتیجه یک صدا زدن call خاص رخ میدهند.
اجازه دهید نسخه کمی پیچیدهتر از این را به شما نشان دهم و این امر در واقع دو فایل متفاوت را باز خواهد کرد.
دو فایل json با نام های " data schedule " و "data artists" رو داریم . این یک نسخه پیچیدهتر است و این مساله را بزرگتر میکند . این فراخوانی ajax بسیار شبیه قبلی است به جز این که حالا میتوانیم از این روش reject کردن نیز استفاده کنیم. این متد وقتی اجرا می شود که Promise در بدست آوردن دادهها نا موفق باشد، بنابراین هر زمان که اطلاعات از طریق آن وارد شود و موفقیت آمیز باشد resolve و اگر نا موفق شود وارد reject می شود .
من همچنین یک console.log را در اینجا اضافه میکنم، به این دلیل که در واقع دو چیز متفاوت را بارگیری میکنم که میخواهم آن را در حال بارگیری مشخص کنم و این کار را توسط این دستور console log انجام میدیم که همراه با url است ، بنابراین، میتوانید ببینید که زمانی که تازه سازی میشود ، به شما گفته میشود که داده های schedule دریافت شده و سپس داده های artists دریافت شده و این عالی است. چیزی که جالب تره این پایین داره اتفاق میافته . در اینجا من در واقع یک رویداد را روی این دکمه قرار میدهم، اگر روی این دکمه کلیک کنم، باز هم دادهها را نمایش میدهد و توسط print چاپ میشه ، چیزی که میخوام اینه که اول اطلاعات تقویم را دریافت کن و بعد هم بقیه کد ها رو اجرا کن .
درست مانند قبل که اطلاعات رو خارج کردیم ، اما بعد میگویم که یک callback دیگر هم باز گردان ، این همان callback است که ما آن را load Data مینامیم و اگر این کار را انجام دهیم ، در ادامه ، این پرونده دوم، در artists. Json، فایل data در صورتی بارگذاری خواهد شد که این فایل دیگر بارگذاری شده باشد ، تفاوت بین این و آنچه که ما قبلا در عبارت finish نوشتیم اینه که چون اینجا از promise در return استفاده کردیم فایل دوم فقط هنگامی کار میکنه که فایل اول بارگذاری کامل شده باشه و این همون چیزیه که توسط promise ها میتوانیم انجام دهیم ،
این یکی از پارامترها است بنابراین ما میتوانیم یک پارامتر دوم را هم رد کنیم و این یک callback است که اگر promise آن حل نشود و یا اگر آن رد شود خطا انجام می شود .
در واقع ما میتوانیم چیزی را به کنسول خروجی بدهیم و در این مثال، اگر اتفاقی برای promise بیفتد و اجرا نکند، دیگر اطلاعات هرگز بار نخواهند شد، پس ما میتوانیم نسبت به آنچه که در نتیجه تعهد به عمل میآید، بسیار دقیقتر باشیم.
چه اتفاقی میافتد اگر آن رد شود و سپس ما میتوانیم چیزهایی را به نحوی زنجیره کنیم که بتوانیم آن را کنترل کنیم که آیا یک وعده ثانویه یا یک رویداد ثانویه تنها در صورتی رخ میدهد که ما آن را به عنوان یک وعده دیگر میخواهیم و این چیزی است که باعث قدرتمندتر شدن وعدههای دادهشده میشود .
لینک ویدیو این آموزش =
نویسنده : آرش آزادخان
#مصاحبه_شغلی #شمسی_پور_ابریشمی #توسعه_وب
#مصاحبه_شغلی #توسعه_وب #شمسی_پور_ابریشمی #طراحی_وب #امتحان_نهایی #مصاحبه_شغلی #استاد_ابریشمی #بازتولید #امتحان #شمسی_پور