برنامهنویسی ناهمگام یکی از اصول مهم در توسعه نرمافزار است، بهویژه در جاوااسکریپت که بهصورت ذاتی تکنخی (single-threaded) اجرا میشود. با استفاده از الگوهای مختلف برنامهنویسی ناهمگام میتوان به مدیریت بهینه و کارآمد چندین عملیات همزمان پرداخت. در این مقاله به بررسی سه الگوی رایج: Promise.race، Promise.all، و Promise.any میپردازیم و کاربرد هر کدام را در کدنویسی توضیح خواهیم داد.
قبل از اینکه به این الگوها بپردازیم، لازم است بدانیم که یک Promise در جاوااسکریپت، شیئی است که نمایانگر یک عملیات ناهمگام بوده و میتواند یکی از سه حالت زیر را داشته باشد:
Fulfilled: عملیات با موفقیت به پایان رسیده است.
Rejected: عملیات با شکست مواجه شده است.
Pending: عملیات هنوز در حال انجام است و نتیجهای مشخص نشده است.
Promise.all یک الگوی رایج برای اجرای چندین عملیات ناهمگام است که منتظر میماند تا تمامی Promises پاسخی بازگردانند. اگر یکی از Promises با شکست مواجه شود، بقیه هم شکست میخورند.
مثال:
const promise1 = new Promise((resolve) => setTimeout(() => resolve('Result 1'), 2000));
const promise2 = new Promise((resolve) => setTimeout(() => resolve('Result 2'), 3000));
const promise3 = new Promise((resolve, reject) => setTimeout(() => reject('Error in promise 3'), 2500));
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log(results); // This won't execute
})
.catch((error) => {
console.error(error); // Output: Error in promise 3
});
مزایا:
تمامیت نتایج: تمام Promises باید موفق باشند تا خروجی نهایی بازگردانده شود.
کاربردی برای عملیات وابسته به چند نتیجه: مناسب برای زمانی که نیاز دارید چند عملیات مختلف قبل از ادامه کار انجام شوند.
معایب:
شکنندگی بالا: اگر یک Promise شکست بخورد، کل عملیات شکست میخورد و نتایج دیگر Promises برگردانده نمیشود.
در Promise.race، خروجی بر اساس اولین Promises که به حالت "fulfilled" یا "rejected" برسد، برگردانده میشود. این الگو برای مواقعی مناسب است که تنها نتیجه سریعترین عملیات اهمیت دارد.
مثال:
const promise1 = new Promise((resolve) => setTimeout(() => resolve('Result 1'), 2000));
const promise2 = new Promise((resolve) => setTimeout(() => resolve('Result 2'), 1000));
Promise.race([promise1, promise2])
.then((result) => {
console.log(result); // Output: Result 2
})
.catch((error) => {
console.error(error);
});
مزایا:
سرعت بالا: اولین Promise که نتیجه بدهد، مورد قبول است. برای مثال در مسابقات زمانی (Race Condition) مفید است.
کاربردی در زمانسنجی (Timeout): برای محدود کردن مدت زمان اجرای یک Promise میتوان از آن استفاده کرد.
معایب:
عدم تضمین تمامیت نتایج: ممکن است تنها اولین Promise نتیجه دهد و بقیه Promises نادیده گرفته شوند، حتی اگر آنها شکست بخورند.
Promise.any یک روش جدیدتر در جاوااسکریپت (معرفی شده در ES2021) است که منتظر اولین Promise موفق میماند. در این الگو، برخلاف Promise.race، تنها Promises موفق مهم هستند و در صورت شکست همه Promises، خطا برگردانده میشود.
مثال:
const promise1 = new Promise((resolve, reject) => setTimeout(() => reject('Error in promise 1'), 1000));
const promise2 = new Promise((resolve) => setTimeout(() => resolve('Result 2'), 2000));
const promise3 = new Promise((resolve) => setTimeout(() => resolve('Result 3'), 3000));
Promise.any([promise1, promise2, promise3])
.then((result) => {
console.log(result); // Output: Result 2
})
.catch((error) => {
console.error(error); // This won't execute
});
مزایا:
موفقیت مهم است: اولین Promise موفق مهم است و شکست دیگر Promises تأثیری ندارد.
کاربردی در عملیات ناهمزمان وابسته به اولین موفقیت: زمانی که چند عملیات مختلف در جریان است و موفقیت حداقل یکی از آنها کافی است.
معایب:
نیاز به ES2021 یا بالاتر: برای استفاده از این الگو باید از نسخههای جدیدتر جاوااسکریپت استفاده کنید.
ویژگی |
Promise.any |
Promise.race |
Promise.all |
نتیجه نهایی |
بازگرداندن اولین Promise موفق |
بازگرداندن اولین Promise که نتیجه دهد |
بازگرداندن تمامی نتایج موفق |
خطاها |
تنها در صورت شکست تمامی Promises خطا برگردانده میشود |
تنها خطای اولین Promise برگردانده میشود |
اگر یکی شکست بخورد، کل Promises شکست میخورد |
کاربرد |
زمانی که موفقیت یکی از Promises کافی است |
زمانی که نتیجه سریعترین عملیات مهم است |
زمانی که به تمامی نتایج نیاز است |
هر یک از این الگوهای Promises کاربردهای خاص خود را در برنامهنویسی ناهمگام دارند. برای عملیاتهای موازی که نیاز به تمامی نتایج موفق دارید، از Promise.all استفاده کنید. اگر سرعت مهمترین عامل است، Promise.race گزینه مناسبی است. و اگر تنها موفقیت یکی از عملیاتهای موازی برایتان کافی است، Promise.any میتواند بهترین انتخاب باشد.
نظری یافت نشد
معرفی React.js و بررسی مزایای آن برای توسعه وب و اپلیکیشن
28م شهریور 1402
مطالعه بیشتر
آموزش ساخت یک برنامه ساده با Fetch API در جاوا اسکریپت: راهنمای گام به گام
1م آبان 1403
مطالعه بیشتر
مفاهیم پیشرفته در کلاسها و وراثت (Super, Extends) در جاوا اسکریپت: راهنمای کامل و مثالها
29م مهر 1403
مطالعه بیشتر
آموزش ساختار کامپوننت در Vue.js (راهنمای کامل همراه مثال)
15م مرداد 1404
مطالعه بیشتر
آموزش استفاده از تگهای تصویری در HTML: نمایش و مدیریت تصاویر در صفحات وب
29م مرداد 1402
مطالعه بیشتر
آموزش تکنیکهای پیشرفته CSS Grid: طراحی ساختارهای پیچیده و واکنشگرا
18م شهریور 1402
مطالعه بیشتر
بررسی کتابخانههای محبوب جاوا اسکریپت: آشنایی با Lodash و Moment.js - مزایا و کاربردها
4م آبان 1403
مطالعه بیشتر
پیمایش اشیاء و آرایهها در جاوا اسکریپت: راهنمای کامل برای Object.keys، Object.values، for...in و for...of
4م مهر 1403
مطالعه بیشتر
کار با border و تنظیمات آن در CSS: مدیریت زوایای گرد با border-radius
9م آبان 1403
مطالعه بیشتر
تنظیم عرض و ارتفاع عناصر در CSS: استفاده از width، height، max و min برای کنترل دقیق اندازهها
9م آبان 1403
مطالعه بیشتر
آموزش کامل کار با آرایهها و اشیاء در جاوا اسکریپت: ایجاد، دستکاری و پیمایش
2م شهریور 1403
مطالعه بیشتر
مفهوم متغیرها و انواع داده در جاوا اسکریپت: راهنمای جامع برای مبتدیان
28م شهریور 1402
مطالعه بیشتر
تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد