آموزش رایگان جاوا اسکریپت (JavaScript)

الگوهای رایج برنامه‌نویسی ناهمگام در جاوا اسکریپت: Promise.race، Promise.all، و Promise.any کامل و مثال‌ها

1403/08/01 19:08 محراب حسن زاده

برنامه‌نویسی ناهمگام یکی از اصول مهم در توسعه نرم‌افزار است، به‌ویژه در جاوااسکریپت که به‌صورت ذاتی تک‌نخی (single-threaded) اجرا می‌شود. با استفاده از الگوهای مختلف برنامه‌نویسی ناهمگام می‌توان به مدیریت بهینه و کارآمد چندین عملیات همزمان پرداخت. در این مقاله به بررسی سه الگوی رایج: Promise.race، Promise.all، و Promise.any می‌پردازیم و کاربرد هر کدام را در کدنویسی توضیح خواهیم داد.

 

Promise چیست؟

قبل از اینکه به این الگوها بپردازیم، لازم است بدانیم که یک Promise در جاوااسکریپت، شیئی است که نمایانگر یک عملیات ناهمگام بوده و می‌تواند یکی از سه حالت زیر را داشته باشد:

  • Fulfilled: عملیات با موفقیت به پایان رسیده است.

  • Rejected: عملیات با شکست مواجه شده است.

  • Pending: عملیات هنوز در حال انجام است و نتیجه‌ای مشخص نشده است.

 

Promise.all: اجرای همزمان و انتظار برای همه

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: انتظار برای اولین Promise

در 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: انتظار برای اولین Promise موفق

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.all، Promise.race و Promise.any

ویژگی

Promise.any

Promise.race

Promise.all

نتیجه نهایی

بازگرداندن اولین Promise موفق

بازگرداندن اولین Promise که نتیجه دهد

بازگرداندن تمامی نتایج موفق

خطاها

تنها در صورت شکست تمامی Promises خطا برگردانده می‌شود

تنها خطای اولین Promise برگردانده می‌شود

اگر یکی شکست بخورد، کل Promises شکست می‌خورد

کاربرد

زمانی که موفقیت یکی از Promises کافی است

زمانی که نتیجه سریع‌ترین عملیات مهم است

زمانی که به تمامی نتایج نیاز است

 

نتیجه‌گیری

هر یک از این الگوهای Promises کاربردهای خاص خود را در برنامه‌نویسی ناهمگام دارند. برای عملیات‌های موازی که نیاز به تمامی نتایج موفق دارید، از Promise.all استفاده کنید. اگر سرعت مهم‌ترین عامل است، Promise.race گزینه مناسبی است. و اگر تنها موفقیت یکی از عملیات‌های موازی برایتان کافی است، Promise.any می‌تواند بهترین انتخاب باشد.

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

آموزش صفر تا صد ساخت ماشین حساب با جاوا اسکریپت (پروژه محور و کاربردی)
1405/03/13 23:55

آموزش صفر تا صد ساخت ماشین حساب با جاوا اسکریپت (پروژه محور و کاربردی)

مطالعه بیشتر
آموزش جامع ساخت فرم ثبت‌نام کاربران با PHP و MySQL طبق اصول امنیتی گوگل
1405/05/13 21:34

آموزش جامع ساخت فرم ثبت‌نام کاربران با PHP و MySQL طبق اصول امنیتی گوگل

مطالعه بیشتر
آموزش ساخت دیتابیس و جدول برای پروژه PHP طبق استاندارد گوگل
1405/05/04 23:38

آموزش ساخت دیتابیس و جدول برای پروژه PHP طبق استاندارد گوگل

مطالعه بیشتر
آموزش متغیرهای سفارشی (Custom Properties) در CSS: نحوه تعریف و استفاده از var
1402/06/18 22:41

آموزش متغیرهای سفارشی (Custom Properties) در CSS: نحوه تعریف و استفاده از var

مطالعه بیشتر
استفاده از overflow در CSS برای مدیریت محتوای اضافی: راهنمای کامل و کاربردی
1403/08/11 21:37

استفاده از overflow در CSS برای مدیریت محتوای اضافی: راهنمای کامل و کاربردی

مطالعه بیشتر
آشنایی با Vue CLI و ایجاد پروژه‌های پیشرفته در Vue.js | راهنمای کامل
1404/09/29 21:09

آشنایی با Vue CLI و ایجاد پروژه‌های پیشرفته در Vue.js | راهنمای کامل

مطالعه بیشتر
آموزش مدیریت Box Model و ترکیب اجزای آن با CSS: کنترل دقیق فاصله‌ها و ابعاد عناصر
1402/06/05 23:30

آموزش مدیریت Box Model و ترکیب اجزای آن با CSS: کنترل دقیق فاصله‌ها و ابعاد عناصر

مطالعه بیشتر
آموزش جامع حلقه‌های while و do while در PHP به زبان ساده و کاربردی
1405/04/04 00:17

آموزش جامع حلقه‌های while و do while در PHP به زبان ساده و کاربردی

مطالعه بیشتر
کار با فیلترهای CSS: آموزش استفاده از blur، brightness و contrast برای افکت‌های تصویری جذاب
1403/08/11 21:08

کار با فیلترهای CSS: آموزش استفاده از blur، brightness و contrast برای افکت‌های تصویری جذاب

مطالعه بیشتر
آموزش جامع دستور SELECT و نمایش اطلاعات دیتابیس طبق استانداردهای گوگل و سئو
1405/05/13 21:07

آموزش جامع دستور SELECT و نمایش اطلاعات دیتابیس طبق استانداردهای گوگل و سئو

مطالعه بیشتر
آموزش جامع توابع بازگشتی (Recursion) و کاربردهای آن در جاوا اسکریپت: مثال‌ها و مفاهیم
1403/07/29 20:15

آموزش جامع توابع بازگشتی (Recursion) و کاربردهای آن در جاوا اسکریپت: مثال‌ها و مفاهیم

مطالعه بیشتر
کار با border و تنظیمات آن در CSS: مدیریت زوایای گرد با border-radius
1403/08/09 20:16

کار با border و تنظیمات آن در CSS: مدیریت زوایای گرد با border-radius

مطالعه بیشتر

تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد