برنامهنویسی همزمان و ناهمزمان دو مفهوم کلیدی در توسعه نرمافزار هستند که به شما امکان میدهند تا نحوه اجرای کد را مدیریت کنید. در جاوا اسکریپت، برنامهنویسی ناهمزمان به دلیل ویژگیهای غیرهمزمان زبان و نیاز به کار با ورودی/خروجی (I/O) و درخواستهای شبکه، نقش بسیار مهمی دارد. در این مقاله، به بررسی مفاهیم همزمان و ناهمزمان، تفاوتها و نحوه مدیریت آنها در جاوا اسکریپت خواهیم پرداخت.
در برنامهنویسی همزمان، کد به ترتیب و به صورت خطی اجرا میشود. این بدان معنی است که برنامه به ترتیب دستورات را اجرا میکند و برای هر دستور تا زمانی که دستور قبلی تمام نشود، صبر میکند.
مثال: برنامهنویسی همزمان
function fetchData() {
console.log("Fetching data...");
// شبیهسازی تأخیر در پردازش
for (let i = 0; i < 1e9; i++) {}
console.log("Data fetched.");
}
console.log("Start");
fetchData();
console.log("End");
در این مثال:
fetchData() به صورت همزمان اجرا میشود و اجرای "End" تا زمانی که fetchData() تمام نشده باشد، متوقف میشود.
در برنامهنویسی ناهمزمان، کد میتواند بدون انتظار برای اتمام یک عملیات، به اجرای سایر عملیاتها ادامه دهد. این مفهوم برای برنامههای با تعاملات ورودی/خروجی، مانند درخواستهای شبکه، بسیار مفید است.
مثال: برنامهنویسی ناهمزمان
console.log("Start");
setTimeout(() => {
console.log("Data fetched.");
}, 2000); // شبیهسازی تأخیر در پردازش به مدت 2 ثانیه
console.log("End");
در این مثال:
setTimeout یک عملیات ناهمزمان است که پس از مدت زمان مشخص، تابع را اجرا میکند.
"End" قبل از "Data fetched" چاپ میشود، زیرا setTimeout برنامه را متوقف نمیکند.
Event Loop یا حلقه رویداد، مکانیزمی است که به جاوا اسکریپت اجازه میدهد تا برنامهنویسی ناهمزمان را مدیریت کند. این مکانیزم وظیفه دارد که نوبتهای مختلف از کد را مدیریت کند و اطمینان حاصل کند که عملیاتهای ناهمزمان به درستی اجرا شوند.
نحوه عملکرد Event Loop:
Stack (پشته): جایی که توابع در حال اجرا قرار دارند.
Callback Queue (صف بازخورد): جایی که توابع ناهمزمان و بازخوردها (مانند توابع از setTimeout) قرار میگیرند.
Event Loop: حلقهای که از پشته خالی بودن و وجود بازخوردها در صف بازخورد را بررسی میکند و در صورت وجود، آنها را به پشته اضافه میکند.
Callback Queue جایی است که توابعی که باید به طور ناهمزمان اجرا شوند، در آن قرار میگیرند. پس از پایان اجرای توابع موجود در پشته، Event Loop این توابع را از صف بازخورد برداشته و به پشته اضافه میکند.
مثال: نحوه کارکرد Event Loop
console.log("Start");
setTimeout(() => {
console.log("Timeout callback");
}, 0);
console.log("End");
در این مثال:
"Start" و "End" به ترتیب چاپ میشوند.
توابع setTimeout در صف بازخورد قرار میگیرند و پس از اجرای دستورات همزمان، "Timeout callback" چاپ میشود.
Promises (وعدهها) برای مدیریت عملیاتهای ناهمزمان طراحی شدهاند و به شما این امکان را میدهند که کدهای غیرهمزمان را به شکل قابلفهمتر و مدیریتپذیرتر بنویسید. Promiseها وضعیتهای مختلفی دارند:
Pending: وضعیت اولیه، وقتی که عملیات هنوز در حال انجام است.
Fulfilled: زمانی که عملیات به درستی تمام شده است.
Rejected: زمانی که عملیات با خطا مواجه شده است.
ساختار Promise
const myPromise = new Promise((resolve, reject) => {
// عملیات ناهمزمان
setTimeout(() => {
resolve("Success!");
}, 2000);
});
myPromise.then(result => {
console.log(result); // Output: Success!
}).catch(error => {
console.log(error);
});
async و await به شما این امکان را میدهند که کدهای ناهمزمان را به شیوهای همزمانتر بنویسید و از Promiseها به شکل سادهتری استفاده کنید.
مثال: استفاده از async و await
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function example() {
console.log("Start");
await delay(2000); // منتظر 2 ثانیه
console.log("End");
}
example();
در این مثال:
تابع delay یک Promise را بازمیگرداند که بعد از مدت زمان مشخص شده، حل میشود.
با استفاده از await, تابع example منتظر میماند تا Promise به حالت Fulfilled برسد و سپس ادامه مییابد.
const myPromise = new Promise((resolve, reject) => {
// شبیهسازی خطا
reject("Error occurred!");
});
myPromise.then(result => {
console.log(result);
}).catch(error => {
console.log(error); // Output: Error occurred!
});
async function example() {
try {
await delay(2000);
throw new Error("Something went wrong!");
} catch (error) {
console.log(error.message); // Output: Something went wrong!
}
}
example();
Callbacks سادهترین و قدیمیترین روش برای مدیریت عملیاتهای ناهمزمان هستند. معایب آنها شامل معضل "Callback Hell" است که میتواند کد را پیچیده و غیرقابلخوانا کند.
Promises بهبودهایی نسبت به Callbacks ارائه میدهند و کدهای ناهمزمان را با استفاده از زنجیرههای then و catch سادهتر میکنند. آنها کمک میکنند تا از معضل Callback Hell اجتناب شود.
async/await بیشتر شبیه به کدهای همزمان است و به شما این امکان را میدهد که از مزایای Promises بدون پیچیدگی استفاده کنید. با استفاده از async/await میتوانید کدهای ناهمزمان را به روشی خواناتر و مدیریتیتر بنویسید.
درک مفاهیم برنامهنویسی همزمان و ناهمزمان برای توسعه نرمافزارهای مدرن بسیار حیاتی است. جاوا اسکریپت با استفاده از Event Loop، Callbacks، Promises و async/await ابزارهای قدرتمندی برای مدیریت عملیاتهای ناهمزمان فراهم میکند. با استفاده از این ابزارها میتوانید برنامههای کارآمد و مقیاسپذیری بنویسید که به خوبی با عملیاتهای ورودی/خروجی و درخواستهای شبکه تعامل دارند. یادگیری نحوه استفاده مؤثر از این ابزارها به شما کمک خواهد کرد تا کدهای بهتری بنویسید و مشکلات مربوط به عملکرد و مدیریت ناهمزمانی را به طور مؤثری حل کنید.
نظری یافت نشد
معرفی جاوا اسکریپت و نحوه استفاده از آن برای توسعه وب تعاملی: راهنمای جامع
27م شهریور 1402
مطالعه بیشتر
استفاده از clip-path در CSS برای برشهای زیبا و جذاب: راهنمای کامل
16م آبان 1403
مطالعه بیشتر
استفاده از font face در CSS برای اضافه کردن فونتهای سفارشی: راهنمای کامل
16م آبان 1403
مطالعه بیشتر
آموزش قالببندی متن در HTML: استفاده از تگها و CSS برای استایلدهی
23م مرداد 1402
مطالعه بیشتر
آموزش استفاده از box-shadow و text-shadow در CSS: ایجاد سایههای زیبا و جذاب
11م آبان 1403
مطالعه بیشتر
مفاهیم Promise و چگونگی استفاده از آن در جاوا اسکریپت: راهنمای کامل همراه با مثالها
30م مهر 1403
مطالعه بیشتر
آموزش ارتباط با سرور و ارسال درخواستهای HTTP با Fetch API در جاوا اسکریپت: راهنمای جامع با مثالها
1م آبان 1403
مطالعه بیشتر
آموزش جامع توابع بازگشتی (Recursion) و کاربردهای آن در جاوا اسکریپت: مثالها و مفاهیم
29م مهر 1403
مطالعه بیشتر
معرفی React.js و بررسی مزایای آن برای توسعه وب و اپلیکیشن
28م شهریور 1402
مطالعه بیشتر
تفاوت Callbacks و Promises در جاوا اسکریپت: مقایسه جامع با مثالها
30م مهر 1403
مطالعه بیشتر
آموزش کامل ویژگی background در CSS: تنظیمات پسزمینه برای طراحی وب راهنمای جامع
5م شهریور 1402
مطالعه بیشتر
آموزش اضافه کردن ویدئو و صدا به وبسایت: نحوه استفاده از تگهای video و audio در HTML
23م مرداد 1402
مطالعه بیشتر
تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد