در دنیای برنامهنویسی، مدیریت عملیاتهای ناهمزمان یکی از چالشهای اصلی است. در جاوا اسکریپت، مفهوم Promise (وعده) به شما این امکان را میدهد که این عملیاتهای ناهمزمان را به شیوهای ساختاریافته و قابلفهم مدیریت کنید. در این مقاله، به بررسی مفهوم Promise و نحوه استفاده از آن در جاوا اسکریپت خواهیم پرداخت.
یک Promise نماینده یک عملیات ناهمزمان است که ممکن است به نتیجه برسد یا با خطا مواجه شود. Promiseها به شما این امکان را میدهند که به طور منظم و قابلفهم با عملیاتهای ناهمزمان تعامل کنید. یک Promise میتواند در یکی از سه وضعیت زیر باشد:
Pending (در حال انتظار): وضعیت اولیه، زمانی که Promise هنوز به نتیجه نرسیده است.
Fulfilled (موفق): زمانی که Promise به درستی حل شده است و نتیجه آن آماده است.
Rejected (رد شده): زمانی که Promise با خطا مواجه شده است.
یک Promise با استفاده از سازنده Promise ایجاد میشود. سازنده Promise دو تابع به نامهای resolve و reject را به عنوان آرگومان میپذیرد.
ساختار کلی Promise:
const myPromise = new Promise((resolve, reject) => {
// عملیات ناهمزمان
if (/* عملیات موفقیتآمیز */) {
resolve('نتیجه موفق');
} else {
reject('خطا');
}
});
مثال:
const myPromise = new Promise((resolve, reject) => {
setTimeout(() => {
const success = true; // شبیهسازی موفقیت یا خطا
if (success) {
resolve("Data successfully fetched!");
} else {
reject("Error fetching data.");
}
}, 2000); // شبیهسازی تأخیر
});
برای مصرف (استفاده) از Promise، از متدهای then, catch, و finally استفاده میکنید.
ساختار کلی مصرف Promise:
myPromise
.then(result => {
// کاری که باید انجام شود در صورت موفقیت
console.log(result);
})
.catch(error => {
// کاری که باید انجام شود در صورت خطا
console.error(error);
})
.finally(() => {
// کاری که باید انجام شود در هر حالت، موفقیت یا خطا
console.log("Operation completed.");
});
مثال:
myPromise
.then(result => {
console.log(result); // Output: Data successfully fetched!
})
.catch(error => {
console.error(error); // Output: Error fetching data.
})
.finally(() => {
console.log("Operation completed."); // Output: Operation completed.
});
یکی از ویژگیهای قدرتمند Promiseها، قابلیت زنجیرهسازی آنهاست. شما میتوانید چندین then را به یک Promise اضافه کنید تا توابع مختلف به ترتیب اجرا شوند.
مثال:
const fetchData = new Promise((resolve, reject) => {
setTimeout(() => resolve("Data"), 1000);
});
fetchData
.then(data => {
console.log(data); // Output: Data
return data + " processed";
})
.then(processedData => {
console.log(processedData); // Output: Data processed
})
.catch(error => {
console.error(error);
});
Promise.all برای اجرای چندین Promise به طور همزمان و دریافت نتایج آنها به صورت یک آرایه استفاده میشود. این متد زمانی موفق است که تمام Promiseها به حالت Fulfilled برسند.
مثال:
const promise1 = new Promise(resolve => setTimeout(() => resolve('First'), 1000));
const promise2 = new Promise(resolve => setTimeout(() => resolve('Second'), 2000));
Promise.all([promise1, promise2])
.then(results => {
console.log(results); // Output: ['First', 'Second']
})
.catch(error => {
console.error(error);
});
Promise.race برای اجرای چندین Promise به طور همزمان و دریافت نتیجه اولین Promise که به وضعیت Fulfilled یا Rejected برسد، استفاده میشود.
مثال:
const promise1 = new Promise((resolve, reject) => setTimeout(() => resolve('First'), 1000));
const promise2 = new Promise((resolve, reject) => setTimeout(() => reject('Second'), 2000));
Promise.race([promise1, promise2])
.then(result => {
console.log(result); // Output: First
})
.catch(error => {
console.error(error); // Output: Second
});
async/await یک روش مدرن و خواناتر برای کار با Promiseهاست. با استفاده از async و await میتوانید کدهای ناهمزمان را به شکل مشابه کدهای همزمان بنویسید.
ساختار async و await:
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Error:', error);
}
}
مثال:
async function fetchData() {
try {
const data = await new Promise((resolve, reject) => {
setTimeout(() => resolve("Fetched Data"), 1000);
});
console.log(data); // Output: Fetched Data
} catch (error) {
console.error(error);
}
}
fetchData();
Promiseها برای مدیریت عملیاتهای ناهمزمان مانند درخواستهای شبکه، خواندن فایلها و تایمرها بسیار مفید هستند. آنها به شما کمک میکنند تا کدهای خوانا و مدیریتی بنویسید.
توجه داشته باشید که مدیریت خطا در Promiseها به طور صحیح بسیار مهم است. از متد catch برای مدیریت خطاها استفاده کنید و از finally برای انجام کارهایی که باید در هر حالت انجام شود، استفاده کنید.
با استفاده از async/await میتوانید کدهای ناهمزمان را به شکل سادهتر و مشابه کدهای همزمان بنویسید، که باعث افزایش خوانایی و نگهداری آسانتر کد میشود.
Promiseها ابزارهای قدرتمندی برای مدیریت عملیاتهای ناهمزمان در جاوا اسکریپت هستند و با استفاده از آنها میتوانید کدهای پیچیدهتری بنویسید که به راحتی با عملیاتهای ورودی/خروجی و درخواستهای شبکه تعامل دارند. با درک و استفاده صحیح از Promiseها و async/await, میتوانید برنامههای کارآمدتر و مقیاسپذیرتری بسازید و مشکلات مربوط به مدیریت زمان و ناهمزمانی را به طور مؤثری حل کنید.
نظری یافت نشد
آموزش استفاده از تگهای خاص HTML: تگهای کاربردی برای طراحی وبسایت
22م مرداد 1402
مطالعه بیشتر
بررسی کتابخانههای محبوب جاوا اسکریپت: آشنایی با Lodash و Moment.js - مزایا و کاربردها
4م آبان 1403
مطالعه بیشتر
آموزش ساخت یک برنامه ساده با Fetch API در جاوا اسکریپت: راهنمای گام به گام
1م آبان 1403
مطالعه بیشتر
آموزش ارثبری (Inheritance) در جاوا اسکریپت: نحوه استفاده از پروتوتایپها و کلاسها
28م مهر 1403
مطالعه بیشتر
نصب Vue.js و ایجاد پروژه ساده: آموزش گامبهگام راهاندازی Vue
28م شهریور 1402
مطالعه بیشتر
آموزش تکنیکهای پیشرفته CSS Grid: طراحی ساختارهای پیچیده و واکنشگرا
18م شهریور 1402
مطالعه بیشتر
آموزش ایجاد یک پروژه ساده React: شروع کار و ساختاردهی کامپوننتها
28م شهریور 1402
مطالعه بیشتر
آموزش CSS Transform و Transition: تبدیلها و ایجاد تغییرات ظاهری پویا
10م شهریور 1402
مطالعه بیشتر
جمعبندی، مرور مطالب و پروژه نهایی: ایجاد یک اپلیکیشن وب کامل با جاوا اسکریپت - راهنمای گام به گام
5م آبان 1403
مطالعه بیشتر
استفاده از Viewports و Viewport Units در CSS: طراحی واکنشگرا با vw، vh، vmin و vmax
16م آبان 1403
مطالعه بیشتر
آموزش ایجاد و حذف المانهای DOM به صورت داینامیک با جاوا اسکریپت: راهنمای جامع و کاربردی
2م آبان 1403
مطالعه بیشتر
آموزش متغیرهای سفارشی (Custom Properties) در CSS: نحوه تعریف و استفاده از var
18م شهریور 1402
مطالعه بیشتر
تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد