45- آموزش جاوااسکریپت | آشنایی با برنامهنویسی غیرهمزمان (Asynchronous)
برنامهنویسی غیرهمزمان (Asynchronous) در جاوااسکریپت به ما اجازه میدهد عملیات سنگین (مانند درخواستهای HTTP) را بدون مسدود کردن اجرای برنامه انجام دهیم. در این آموزش با تفاوت کدهای همزمان و غیرهمزمان و روشهای مدیریت آنها مثل Callbackها، Promiseها و Async/Await آشنا میشویم.
در این بخش از مسیر یادگیری، از مباحث مرتبط با DOM فاصله میگیریم تا به یکی از مفاهیم حیاتی و پرکاربرد در جاوااسکریپت، یعنی برنامهنویسی غیرهمزمان (Asynchronous JavaScript) بپردازیم. این مبحث پایه و اساس کار با APIها و سرویسهای مختلف است.
برنامهنویسی همزمان (Synchronous) چیست؟
در حالت همزمان، کدها خط به خط و به ترتیب اجرا میشوند. اگر یک تابع زمان زیادی برای اجرا نیاز داشته باشد (مثلاً دریافت داده از یک سرور دوردست)، اجرای کل برنامه تا پایان آن عملیات متوقف میشود. این حالت را Blocking Code یا کد مسدودکننده مینامند.
مثال کد همزمان:
// فرض کنید این تابع دادهها را از سرور دریافت میکند و زمانبر است
const posts = loadPostSync();
// خط زیر تا زمانی که تابع بالا تمام نشود، اجرا نخواهد شد
doNextThing();
در این مثال، اگر دریافت پستها چند ثانیه طول بکشد، رابط کاربری قفل میشود و کاربر هیچ واکنشی از برنامه دریافت نمیکند.
برنامهنویسی غیرهمزمان (Asynchronous)
در برنامهنویسی غیرهمزمان، برنامه منتظر پایان عملیات زمانبر نمیماند و به اجرای کدهای بعدی ادامه میدهد. وقتی عملیات سنگین (مثل دانلود دادهها) تمام شد، یک تابع Callback اجرا میشود تا نتایج را پردازش کند. این رویکرد باعث افزایش چشمگیر سرعت و کارایی برنامه میشود.
مثال کد غیرهمزمان:
// در این حالت، یک تابع Callback ارسال میکنیم
loadPostAsync(function(posts) {
// کدی که پس از دریافت پستها اجرا میشود
});
// این تابع بلافاصله اجرا میشود و منتظر دریافت پستها نمیماند
doNextThing();
روشهای مدیریت کد غیرهمزمان
بیشتر کارهای غیرهمزمانی که در جاوااسکریپت انجام میدهید، مربوط به APIها یا کتابخانههایی مانند Ajax، Fetch API یا سیستم فایل در Node.js است. برای مدیریت پاسخها در این محیطها، سه روش اصلی وجود دارد:
- Callbackها: روش قدیمی و پایهای که در مثال بالا دیدیم.
- Promiseها: یک روش مدرنتر (ES6) برای مدیریت عملیات غیرهمزمان که کدی خواناتر ایجاد میکند.
- Async/Await: جدیدترین و بهترین روش که به ما اجازه میدهد کدهای غیرهمزمان را بنویسیم اما ظاهر آنها مانند کدهای همزمان (خطی و ساده) باشد.
در بخشهای بعدی این آموزش، عمیقتر به هر یک از این روشها خواهیم پرداخت و با ساخت یک کتابخانه HTTP ساده، نحوه استفاده عملی از آنها را یاد میگیریم.