توی فلاتر ما از async و await برای برنامه نویسی ناهمزمان استفاده میکنیم. از async استفاده میکنیم که یک فانکشن رو به عنوان فانکشن ناهمزمان معرفی کنیم. Async به تابعمون این امکان رو میده که بتونه از کلمه کلیدی await استفاده بکنه برای اینکه اجرای خودش رو تا زمانی که عملیات های ناهمزمانی مثل درخواست های شبکه یا ورودی / خروجی فایل ها، متوقف کنه. با این کار تابع میتونه عملیات های دیگه رو انجام بده یا اینکه صبر کنه برای گرفتن نتیجه، بدون اینکه کل روند برنامه رو متوقف کنه.
بیاید با یک مثال بهتر درکشون کنیم:
توی مثال بالا، اول یک تابع داریم به نام fetchData() که کاری شبیه به درخواست های شبکه رو انجام میده، چیزی هم که برمیگردونه، 'Data from the network' یه رشته یا String هستش(چیز پیچیده ای نیست!).
تابع main هم به عنوان یک تابع async تعریف شده که بتونیم از کلمه کلیدی await استفاده کنیم. ما fetchData() رو با استفاده از کلمه کلیدی await، صدا میزنیم، که با این کار انجام عملیات های تابع main رو تا زمانی که درخواستمون رو بصورت کامل از شبکه بگیریم، متوقف میکنه، و زمانی که درخواست بصورت کامل دریافت شد، اون رو در متغیر result ذخیره میکنیم و ازش استفاده میکنیم.
طبق چیزی که میبینیم، وقتی که از کلمه await استفاده میکنیم، انجام عملیات تابع main() در اون قسمت متوقف میشه. تا زمانی هم که تابع awaited (که در اینجا fetchData هستش)، کارش تموم نشده و نتیجه رو دریافت نکرده، به مرحله ی بعد نمیره مثلا، توی مثال بالا ('Print ('End اجرا نمیشه و منتظر میمونه که تابع fetchData نتیجه رو دریافت کنه و توی متغیر result ذخیره کنه. اگه درخواست fetchData، تقریبا 2 ثانیه طول بکشه برای کامل شدن، ('Print ('End بعد از 2 ثانیه اجرا میشه.
یعنی روند اجرای تابع main اینجوریه:
1- اول start رو نشون میده
2- (بعد از 2 ثانیه صبر کردن) 'Data from the network' رو نشون میده
3-در آخر هم End رو نشون میده
و تابع main به اتمام میرسه.
استفاده از await بهتون کمک میکنه که کدی بنویسید که در ظاهر بصورت همزمان در حال اجرا هستش، ولی در واقعیت بصورت ناهمزمان در حال اجرای تسک ها هست.