توابع Async اساسا یک روش برای کارکردن با کدهای غیرهمزمان در جاوا اسکریپت است.برای درک این که این توابع واقعا چه هستند و چگونه کار میکنند ابتدا باید Promise ها را به خوبی درک کنیم.اگر نمیدونید Promise ها چی هستند پیشنهاد میکنم مقاله اشنایی با Promise در جاوااسکریپت را مطالعه کنید.تا زمانی که Promise رو درک نکنید نمی تونید مفهوم Async/Await رو درک کنید.
- جدیدترین روش نوشتن کدهای غیرهمزمان در جاوااسکریپت
- غیرقابل انسداد است (درست شبیه Promise و Callback)
- Async/Await برای ساده سازی روند کار و نوشتن Promise های زنجیره ای طراحی شده است.
- توابع Async یک Promise رو برمیگردونن. اگر تابع یک خطا رو برمیگردونه،Promise رد شده و اگر تابع یک مقدار رو برمیگردونه Promise پذیرفته شده.
Syntax
نوشتن توابع async بسیار ساده است . کافیه که شما کلمه کلیدی async رو قبل از function اضافه کنید
Await
توابع Async میتوانند از کلیدواژه Await استفاده کنند.این کار توابع Async را متوقف میکند و منتظر اجرای دستور بازگشتی می ماند.
برای درک همه این ها اجازه بدهید که کار را با یک مثال ادامه بدهیم. ابتدا قصد داریم یک کد را با استفاده از Promise ها ایجاد کنیم سپس این کدها را با استفاده از async بازنویسی کنیم تا ببینیم که چقدر کارمان ساده تر شده است.
کد زیر را درنظر بگیرید:
در این کد ما یک تابع به نام doubleAfter2Seconds تعریف کردیم. این تابع یک عدد را به عنوان ورودی میگیرد و بعد از 2 ثانیه مقدار آن را دوبرابر میکند.ما میتونیم تابع رو فراخوانی کنیم و این تابع رو با مقدار 10 تست کنیم.سپس بعد از اینکه Promise به طور کامل resolve شد،ما مقدار برگشتی را در کنسول log میکنیم. به قطعه کد زیر توجه کنید
اما اگه ما بخوایم تابع رو چندین مرتبه با مقادیر مختلف فراخوانی کنیم و مقدار برگشتی رو به نتیجه اضاف کنیم چه اتفاقی رخ می دهد؟متاسفانه ما نمیتوانیم مقادیر برگشتی رو به یکدیگر اضاف کنیم.
مشکل کد بالا این است که در واقع قبل از resolve شدن کامل promise خروجی در کنسول log شده است.یک راه حل ممکن راه اندازی یک promise زنجیره ای است.برای این کار ما یک تابع جدید به نام addPromise ایجاد میکنیم.این تابع یک مقدار را به عنوان ورودی میگیرد و یک promise را بر میگرداند.
حالا ما میتوانیم مقادیر برگشتی رو به نتیجه فراخوانی اضاف کنیم.در این مثال ما باید x + 2*a + 2*b + 2*c رو برگردونیم.
حالا خط به خط کدهای بالا رو بررسی میکنیم.
- ابتدا ما تابع addPromise رو ایجاد کردیم.این تابع یک ورودی میگیرد.
- سپس ما یک Promise ایجاد کردیم.توجه کنید که ما برای سادگی ما خطاها رو مدیریت نمی کنیم.
- سپس ما doubleAfter2Seconds رو برای اولین بار فراخوانی کردیم و مقدار 10 رو به عنوان ورودی بهش پاس دادیم.بعد از 2 ثانیه مقدار 20 درون متغیر a برگردانده میشود.
- سپس دوباره doubleAfter2Seconds رو با مقدار 20 فراخوانی کردیم و بعد از 2 ثانیه مقدار 40 درون متغیرb برگردانده میشود.
- برای آخرین بار doubleAfter2Seconds رو با مقدار 30 فراخوانی میکنیم و بعد از 3 ثانیه مقدار 60 درون متغیر c برگردانده میشود.
- در نهایت Promise ما با مقدار 10+20+40+60یا130 resolve میشود.
زمانی که ما همه کدها رو کنار هم قرار دهیم قطعه کد زیر رو داریم:
تغییر از Promises به Async / Await
حالا کدهای بالا رو بااستفاده از Async/Await بازنویسی میکنم.تابع addPromise رو حذف میکنیم ویک تابع جدید به نام addAsync ایجاد میکنیم.این تایع دقیقا همان هدف addPromise رو دنبال میکنه.وقتی که تایع addAsync رو دارید مینویسید حتما حواستون باشه که از کلمه کلیدی async قبل از function استفاده کنید.
حالا که یک تابع async ایجاد کردیم میتونیم از کلیدواژه await استفاده کنیم که کد ما را متوقف میکند تا زمانی که promise ما به طور کامل resolve شود.
زمانی که ما همه کدها رو کنار هم قرار دهیم قطعه کد زیر رو داریم:
همونطور که میبینید با استفاده از Async/Await کدهای ما بسیار ساده تر و قابل فهم تر میشود و به راحتی میشه اونا رو تغییر داد.امیدوارم خوندن این مقاله براتون مفید باشه.اگه هنوز متوجه مفهوم Async/Await نشده اید به احتمال زیاد شما به طور کامل متوجه مفهوم Promiseها نشده اید و بهتره که مقاله آشنایی با Promise در جاوا اسکریپت رو بخونید تا اطلاعات بیشتری در این زمینه بدست بیارید.
اگر قصد یادگیری جاوا اسکریپت به صورت تخصصی و حرفه ای را دارید، پیشنهاد می کنم آموزش پیشرفته و پروژه محور جاوا اسکریپت (javascript) را مشاهده کنید
بدون دیدگاه