تعداد بازدید: 124

Promise و Callback در جاوا اسکریپت

کاربرد Callback ها و Promise ها برای پردازش های نا همگام (Asynchronous) می باشد . به طور مثال دو پردازش به صورت همزمان اجرا می گردد. ممکن از یک پردازش بعد از ۱۰۰ میلی ثانیه به اتمام برسد و پردازش دیگر بعد از ۲۰۰ میلی ثانیه . مدیریت پردازش ها به زمان آن ها بستگی دارد و ما اگر بخواهیم دستی آن ها را مدیریت کنیم با مفاهیم جدیدی به نام Callback و Promise مواجه خواهیم بود.

ما دو نوع پردازش در علوم کامپیوتر داریم :

  • Asynchronous یا پردازش ناهمگام : در این نوع پردازش زمانی که شما یک پردازش را اجرا می کنید بدون توجه به این که پردازش اول تمام شده است یا نه به پردازش دوم می روید و عملا پردازش ها به صورت غیر همزمان تمام می شوند ( بدون ترتیب ) به این دسته از پردازش ها ناهمگام می گوییم.
  • synchronous یا پردازش همگام : در این نوع پردازش که به آن ها Blocking نیز می گویند تا اتمام پردازش اول پردازش دوم انجام نمی شود. به طور مثال حلقه دوم از یک loop تا اتمام حلقه اول شروع نمی شود.

Callback Functions

در این نوع توابع ما می توانیم یک تابع را به عنوان ورودی تابع خود بگیریم و جایی که مطمئن شدیم که تابع اصلی اجرا شده است تابع ورودی را اجرا کنیم که در این صورت ماهیت تابع ابتدایی به callback تغییر می کند.

به طور مثال در تابع زیر می خواهیم که یک تابع پس تابع دیگری اجرا گردد. اجرای تابع اول ۲ ثانیه زمان می برد و اجرای تابع دوم کمتر از ۱ میلی ثانیه . به این ترتیب اگر به صورت عادی آن ها را اجرا کنیم ابتدا تابع دوم خروجی می دهد و بعد تابع اول.

خروجی کد بالا به شکل ابتدا عبارت foo و پس از دو ثانیه عبارت do something نمایش داده می شود . اگر بخواهیم ترتیب اجرا را تغییر دهیم نیاز به callback داریم. برای این منظور باید تابع foo را ملزم به اجرای تمام و کمال تابع doSomething کنیم.

در کد بالا نقطه ای که ما مطمئن شدیم که تابع اصلی اجرا می گردد درون تابع SetTimeout می باشد. این نقطه با توجه به ماهیت توابع می تواند متفاوت باشد . به طور مثال اگر یک اسکریپت لود شد نقطه اطمینان از اتمام تابع چک کردن اسکریپت در صفحه است.

Promise Object

یک شئ از کلاس Promise می باشد که نشان دهنده نتیجه اتمام یا عدم موفقیت (resolve , reject) حاصل از یک پردازش ناهمگام می باشد. این شئ می تواند خروجی یک تابع باشد. این ساختار به مدیریت خطا یا موفقیت آمیز بودن یک عملیات نیز کمک می کند به همین دلیل شباهت زیادی به ساختار try..catch دارد.

برای استفاده از Promise باید یک شئ از کلاس آن بسازید که در متد سازنده آن باید یک تابع اجرا کنید که دو پارامتر می گیرد :

  • resolve : در صورت موفقیت آمیز بودن عملیات آن را باید اجرا کنید.
  • reject : در صورت عدم موفقیت باید آن را اجرا کنید.

هر Promise در سه حالت می باشد. حالت اول pending می باشد که هنوز نتیجه پردازش مشخص نشده است (حالت انتظار) . حالت دوم fulfilled که در صورت موفقیت آمیز بودن پردازش اتفاق می افتد و حالت سوم rejected که در صورت عدم موفقیت اتفاق می افتد.

 

Promise Methods : متد های عمومی شئ ساخته شده از Promise شامل موارد زیر می باشد :

  • then : بلوک موفقیت آمیز بودن پردازش در صورت اتمام عملیات می باشد که به عنوان ورودی بک تابع می گیرد که پارامتر آن تابع ورودی تابع resolve می باشد که در زمان اجرای عملیات به آن پاس داده شده. در واقع این متد زمانی اجرا می شود که ما در Promise تابع resolve را اجرا کرده باشیم.
  • catch : بلوک عدم موفقیت عملیات می باشد که ورودی آن یک تابع می باشد که پارامتر آن ورودی تابع reject در زمان اجرای Promise می باشد.
  • finally : این یک بلوک که در پایان عملیات (چه موفقیت و چه عدم موفقیت) اجرا می شود. تابع ورودی آن هیچ پارامتری ندارد.

زمانی که یک شئ از Promise در یک تابع ساخته می شود تا قبل از عملیات در حالت pending می باشد . پس از آن یا fulfill می شود یا reject که حالت اول را در then و حالت دوم را در catch می توان مدیریت کرد. این پروسه می تواند به صورت زنجیر وار چندین با اتفاق بیفتد.

به طور مثال ما یک تابع می نویسیم که تعیین کند عدد ورودی آن زوج است یا فرد. این تابع را با setTimeout پیاده سازی می کنیم که زمان بر باشد . به عنوان خروجی به جای true , false به آن یک شئ Promise باز می گردانیم تا استفاده کننده بتواند از متد های آن جهت مدیریت عملیات ریاضی و همچنین مدیریت زمان اجرای تابع استفاده کند.

در کد بالا خروجی تابع checkNumber یک شئ Promise است. برای چک کردن نتیجه باید خروجی آن را در then … catch گذاریم و هر کدام خروجی های متفاوت می تواند داشته باشد.

ماهیت استفاده از Promise ها در زمان ایجاد درخواست ها خود را نمایش می دهد . یعنی زمانی که یک درخواست را به سرور به هر وسیله ای (xmlHttpRequest , axios, …) می فرستیم و منتظر پاسخ هستیم.

مطالب مشابه

اشیا در زبان جاوا اسکریپت - برنامه نویسی شی گرا

اشیا در زبان جاوا اسکریپت

اشیا در زبان جاوا اسکریپت از اهمیت بالایی برخوردار است به گونه ای که می توان گفت زبان جاوا اسکریپت از المان هایی مبتنی...

تکنولوژی ایجکس Ajax

ایجکس Ajax (Asynchronous JavaScript and XML) مجموعه ای از استانداردها و تکنولوژی های وب است که با استفاده از زبان جاوا...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای Promise و Callback در جاوا اسکریپت

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *