آموزش رایگان جاوا اسکریپت (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 می‌تواند بهترین انتخاب باشد.

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

آموزش انیمیشن‌های پیشرفته با keyframes در CSS: طراحی حرکات پویا و چند مرحله‌ای
1402/06/18 22:48

آموزش انیمیشن‌های پیشرفته با keyframes در CSS: طراحی حرکات پویا و چند مرحله‌ای

مطالعه بیشتر
مقدمه‌ای به رویدادها و دستورات در Vue.js: نحوه مدیریت و استفاده از v-on
1402/06/28 23:53

مقدمه‌ای به رویدادها و دستورات در Vue.js: نحوه مدیریت و استفاده از v-on

مطالعه بیشتر
پیمایش اشیاء و آرایه‌ها در جاوا اسکریپت: راهنمای کامل برای Object.keys، Object.values، for...in و for...of
1403/07/04 18:12

پیمایش اشیاء و آرایه‌ها در جاوا اسکریپت: راهنمای کامل برای Object.keys، Object.values، for...in و for...of

مطالعه بیشتر
آموزش کامل حلقه foreach در PHP برای پیمایش آرایه‌ها (به زبان ساده)
1405/04/04 00:22

آموزش کامل حلقه foreach در PHP برای پیمایش آرایه‌ها (به زبان ساده)

مطالعه بیشتر
مفاهیم پیشرفته اشیاء در جاوا اسکریپت: مدیریت خصوصیات و متدها
1403/07/04 17:40

مفاهیم پیشرفته اشیاء در جاوا اسکریپت: مدیریت خصوصیات و متدها

مطالعه بیشتر
تفاوت include، require، include_once و require_once در PHP
1405/05/01 20:32

تفاوت include، require، include_once و require_once در PHP

مطالعه بیشتر
راهنمای جامع جلوگیری از SQL Injection در PHP (طبق استانداردهای گوگل)
1405/05/13 21:19

راهنمای جامع جلوگیری از SQL Injection در PHP (طبق استانداردهای گوگل)

مطالعه بیشتر
استفاده از CSS Scoped و استایل‌دهی به کامپوننت‌ها در Vue.js | آموزش کاربردی
1404/09/23 21:27

استفاده از CSS Scoped و استایل‌دهی به کامپوننت‌ها در Vue.js | آموزش کاربردی

مطالعه بیشتر
مقایسه کامل و جامع MySQLi و PDO در PHP: کدام یک برای پروژه شما مناسب‌تر است؟
1405/05/04 23:45

مقایسه کامل و جامع MySQLi و PDO در PHP: کدام یک برای پروژه شما مناسب‌تر است؟

مطالعه بیشتر
آموزش جامع Session در PHP به زبان ساده + پروژه عملی شبیه‌ساز
1405/05/01 20:07

آموزش جامع Session در PHP به زبان ساده + پروژه عملی شبیه‌ساز

مطالعه بیشتر
آموزش جامع مدیریت خطاها در PHP بر اساس استانداردهای گوگل
1405/05/01 20:23

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

مطالعه بیشتر
راهنمای کامل تگ‌های متنی HTML و اصول سئو برای محتوا
1402/05/18 00:40

راهنمای کامل تگ‌های متنی HTML و اصول سئو برای محتوا

مطالعه بیشتر

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