برنامهنویسی جاوا اسکریپت یکی از اصولیترین زبانهای برنامهنویسی وب است و به عنوان زبان اسکریپتی مشغول به فعالیت است. در جاوا اسکریپت، مفهوم همزمانی یکی از مهمترین ویژگیهاست که به برنامهنویسان این امکان را میدهد تا کد خود را به گونهای طراحی کنند که عملیاتها به صورت همزمان و بدون مسدود شدن اجرا شوند. در این مقاله، به مباحث مرتبط با همزمانی در جاوا اسکریپت می پردازیم و کاربردهای آن را بررسی خواهیم کرد. همچنین پیشنهاد میکنیم آموزش DOM در جاوا اسکریپت را نیز مطالعه نمایید.
مفهوم همزمانی در جاوا اسکریپت
همزمانی در جاوا اسکریپت به معنای اجرای عملیاتها به گونهای است که اجرا بدون انتظار برای اتمام یک عملیات دیگر انجام شود. به عبارت دیگر، کد همزمان، کدی است که اجرای تسکها به صورت موازی انجام میشود و برنامه به سرعت به کار خود ادامه میدهد.
Callback Functions
یکی از روشهای اصلی برای مدیریت همزمانی در جاوا اسکریپت استفاده از توابع بازگشتی یا Callback Functions است. این توابع به عنوان آرگومان به یک تابع دیگر ارسال میشوند و بعد از انجام یک عملیات خاص فراخوانی میشوند. این به برنامهنویس این امکان را میدهد که کدی را تعریف کند که به صورت غیرهمزمان اجرا شود.
function asyncOperation(callback) {
setTimeout(function() {
console.log("Async operation completed.");
callback();
}, 1000);
}
function main() {
console.log("Start of the program");
asyncOperation(function() {
console.log("Callback function executed.");
});
console.log("End of the program");
}
main();
در این مثال، asyncOperation
یک تابع غیرهمزمان است که یک تابع بازگشتی (callback
) را به عنوان ورودی میپذیرد. پس از اتمام عملیات، تابع بازگشتی فراخوانی میشود. وقتی تابع main
اجرا میشود، پیامها به ترتیب “Start of the program”، “End of the program” و “Async operation completed” نمایش داده میشوند، که نشان از همزمانی نیست.
Promises
توابع بازگشتی بههترین راه برای مدیریت همزمانی نیستند و ممکن است زمانی برسد برنامه به تعداد زیادی از این توابع احتیاج داشته و موجب مشکل کردن کد شود. برای حل این مشکل، از اشیاء Promises استفاده میشود. Promises به برنامهنویس این امکان را میدهد تا به راحتی با تعداد زیادی از فرآیندها و توابع همزمان کنار بیاید.
function asyncOperation() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log("Async operation completed.");
resolve();
}, 1000);
});
}
function main() {
console.log("Start of the program");
asyncOperation().then(function() {
console.log("Promise resolved.");
});
console.log("End of the program");
}
main();
در اینجا، asyncOperation
یک Promise ایجاد میکند و پس از اتمام عملیات، resolve
صدا زده میشود. در تابع main
ابتدا asyncOperation
اجرا میشود و پس از اتمام، تابع then
فراخوانی میشود. این به برنامهنویس این امکان را میدهد که با تعداد زیادی از Promises کار کند و بدون نیاز به توابع بازگشتی مشکل، کدهای همزمانی را به راحتی مدیریت کند.
Async/Await
با وارد شدن ES2017 (یا ES8)، یک ویژگی به نام Async/Await به جاوا اسکریپت اضافه شد که این زبان را برای مدیریت همزمانی سادهتر کرد. این ویژگی از نوشتن کدی به شکل همزمان به نحوی که شبیه به کد همزمان نوشته گردیده استفاده میکند.
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function asyncOperation() {
await delay(1000);
console.log("Async operation completed.");
}
async function main() {
console.log("Start of the program");
await asyncOperation();
console.log("End of the program");
}
main();
در اینجا، asyncOperation
یک تابع Async است که از ویژگی Await برای انتظار اتمام عملیات میاستفاده کند. با استفاده از این ویژگی، کد همزمانی به نظر میرسد و به برنامهنویس این امکان را میدهد تا به راحتی با Promises و توابع Async کار کند.
کاربردهای همزمانی در جاوا اسکریپت
- درخواستهای شبکه: وقتی از سرویسهای شبکه استفاده میکنید، از همزمانی برای جلوگیری از مسدود شدن اجرا استفاده میشود. مثال: ارسال درخواستهای AJAX.
- پردازش فایلها: زمانی که با فایلهای بزرگ یا فرآیندهای پردازشی مدیریت میکنید، از همزمانی برای اجرای همزمان کد استفاده میشود.
- برنامههای وب SPA: برنامههای وبی که با استفاده از فریمورکها مانند React یا Angular ایجاد میشوند، از همزمانی برای مدیریت وضعیتها و بارگذاری اطلاعات استفاده میکنند.
- کاربردهای مختلف مرورگر: از همزمانی برای اجرای همزمانی کد در وبسایتها و اپلیکیشنهای مرورگر استفاده میشود.
نتیجهگیری
همزمانی یکی از مفاهیم اساسی در برنامهنویسی جاوا اسکریپت است که برنامهنویسان را قادر به مدیریت بهتر و اجرای بهینهتر عملیاتهای همزمان در برنامههای وب میکند. از Callback Functions به Promises و نهایتاً Async/Await، این زبان از ابزارهای مختلفی برای مدیریت همزمانی برخوردار است. با درک صحیح این ابزارها، برنامهنویسان قادر به ساخت کد همزمان و قابل نگهداری بهتر خواهند بود و تجربه کاربری در وبسایتها بهبود خواهد یافت.