در دنیای برنامهنویسی، مدیریت عملیاتهای ناهمزمان یکی از چالشهای اصلی است. در جاوا اسکریپت، مفهوم 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, میتوانید برنامههای کارآمدتر و مقیاسپذیرتری بسازید و مشکلات مربوط به مدیریت زمان و ناهمزمانی را به طور مؤثری حل کنید.
نظری یافت نشد
تنظیم عرض و ارتفاع عناصر در CSS: استفاده از width، height، max و min برای کنترل دقیق اندازهها
9م آبان 1403
مطالعه بیشتر
آموزش ساخت یک Todo List با استفاده از DOM و جاوا اسکریپت: راهنمای گام به گام
3م آبان 1403
مطالعه بیشتر
کاربرد تگهای meta، title و keywords در سئو: راهنمای جامع بهینهسازی وبسایت
25م مرداد 1402
مطالعه بیشتر
آموزش ایجاد، دسترسی و اصلاح آرایهها در جاوا اسکریپت: راهنمای کامل
4م مهر 1403
مطالعه بیشتر
آموزش لیستها در HTML: طراحی و استایلدهی لیستهای مرتب و نامرتب
20م مرداد 1402
مطالعه بیشتر
آموزش رویدادهای پیشرفته در جاوا اسکریپت: بابلینگ، کپچرینگ و توقف پیشفرض - راهنمای جامع
2م آبان 1403
مطالعه بیشتر
مدیریت ترتیب نمایش با z-index در CSS: آموزش کامل و کاربردی
11م آبان 1403
مطالعه بیشتر
آموزش کامل توابع سازنده (Constructors) و پروتوتایپها (Prototypes) در جاوا اسکریپت: راهنمای جامع
28م مهر 1403
مطالعه بیشتر
کار با border و تنظیمات آن در CSS: مدیریت زوایای گرد با border-radius
9م آبان 1403
مطالعه بیشتر
آموزش کامل کنترل جریان و استفاده از if و else در جاوا اسکریپت: راهنمای جامع برای مبتدیان
2م بهمن 1402
مطالعه بیشتر
چگونه یک فوتر چسبان در CSS بسازیم: آموزش ساخت فوتر ثابت و همیشگی
2م شهریور 1403
مطالعه بیشتر
آموزش ایجاد تصویر و لینک در HTML: نحوه استفاده از تگهای img و a
21م مرداد 1402
مطالعه بیشتر
تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد