معرفی async/await و چند نکته درین باب

فرض کنید می خواید چنتا عملیات رو به صورت متوالی انجام بدید که هر کدوم به نتیجه عملیات قبلی نیاز داره! به احتمال خیلی قوی یه همچین کاری می کنید:`const result1 = do1stThing()const result2 = do2ndThing(result1)const result3 = do3rdThing(result2)...`خب برای مغز‌ما این روند خیلی طبیعیه، قابل درکه و خواناست. و توی خیلی زبان‌های برنامه نویسی(synchronus) این روش درست انجام دادن کارهاست؛ کار اول رو شروع می کنی و منتظر می‌مونی تا تموم شه! کار دوم رو شروع می‌کنی منتظر می‌مونی تا تموم شه... ولی صبر کن! چرا منتظر بمونیم تموم شه؟؟!asynchronus programming، نگرشی متفاوت!! خب چرا باید صبر کنیم و منتظر بمونیم تا یک عملیات تموم شه!!؟؟‌ فرض کنید به دیتابیس درخواست دادیم تا یکسری دیتا‌هارو واسمون پیدا کنه. خب نیازی نیست برنامه ما معطل بمونه تا دیتابیس کارش رو انجام بده و نتیجه رو برگردونه! به جاش میتونه بره کارای دیگه رو انجام بده و از دیتابیس بخواد که وقتی کارش تموم شد اونو خبر کنه تا بیاد نتیجه رو ازش بگیره! ایده جالبیه!!... آره ؟؟!!! خب این رو میگن asynchronus . خیلی جذاب و کاربردی هست و خیلی جاها کاربرد داره! ولی...مشکل کجاست!؟؟مشکل اینجاست که مغز ما asynchronusly کار نمیکنه! در واقع زیاد با روندهای این‌چنینی جور نیست و براش سخته که درک کنه دقیقا چه اتفاقی میوفته! برای اینکه درک این روندها برای خودمون آسون‌تر کنیم تمام تلاشمون رو کردیم تا قیافه کدهای async رو شبیه کدهای همیشگی،آشنا و خوانای sync کینم.async / awaitتو زبان جاوااسکریپت واسه سادگی و خوانایی برنامه‌نویسی asynchronus یه ابزار خیلی خفن داریم async /await ! اینجوری کار می‌کنه که هرکاری دلت می‌خواد می کنی و نهایتا پشت تعریف توابع و زمان صدا زدنشون یه async یا await میزاری و همین خودش بقیه کار رو انجام میده!به همین سادگی!!:)))) `async function doManyThings() { const result1 = await do1stThing() const result2 = await do2ndThing(result1) const result3 = await do3rdThing(result2) ...}doManyThings();`خب حالا واقعا به همین سادگی!؟؟ نه دقیقا! باید بدونید کجا و چطوری و چرا ازش استفاده کنید. حواستون باشه گاهی اوقات فریب‌تون میده و کدی که باهاشون نوشتید اصلا async نیست!! خب حالا من نمی‌خوام وارد جزیيات async/await بشم ولی چنتا نکته که یادگرفتم رو براتون میگمتوابع async همیشه یه Promise به عنوان خروجی برمیگردونن!توابع async از یک Promise ضمنی برای برگردوندن نتایج استفاده می کنن. حتی اگه Promise رو به طور واضح برنگردونید ، تابع async اطمینان میده که کدتون از طریق Promise منتقل شده.توجه کنید که `await` فرایند اجرای کد توی یه تابع async رو متوقف می کنه و فرمون رو میده دست تابع صدازننده اون تابع async.می تونیم توی یه تابع async چندین تا await استفاده کنیم.وقتی از `async await` استفاده می کنید حواستون باشه از `try catch` برای ارورهندلینگ استفاده کنید.اگه که کدتون دارای عملیات مسدودکننده(blocking operation) بهتره که تبدیل کنید به یه تابع async. با این کار مطمعن میشید دیگران می تونن از تابعتون به صورت asyncronus استفاده کنن.با async کردن توابع‌تون شما این امکان رو به کاربر(استفاده کننده از کد شما) که سطح asynchronocity که مورد نیازش هست رو انتخاب کنه.وقتی از `await` توی لوپ و ایتریتورها استفاده می کنید خیلی مراقب باشید. امکانش هست خیلی راحت تو تله‌ی «نوشتن کد متوالی» بیوفتید درصورتی که خیلی رحت میتونستید از parallelism استفاده کنید.حواستون باشه `await` همیشه واسه یک promise هست. اگه می خواید چندین promise رو await کنید یک آرایه از اون promise ها بسازید و اون رو به promise.all پاس بدید.دقت کنید که `await` فقط از ادامه اجرای کد تو تابع async جلوکیری می کنه و مطمعن میشه که تا زمانی که نتیجه promise برگردونده نشده خط های بعدی کد اجرا نشن. پس اگه یه فرایند asyncronus خودش قبلا شروع شده `await` هیچ تاثیری روش نداره.امیدوارم مفید بوده باشه!!لینک منابعی که مطالع کردم و ارشون استفاده کردم: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await https://betterprogramming.pub/understanding-async-await-in-javascript-1d81bb079b2c https://medium.com/@rafaelvidaurre/truly-understanding-async-await-491dd580500e https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Concepts qq