مقایسه async/await با Promises در جاوااسکریپت

در دنیای برنامه‌نویسی جاوااسکریپت، مدیریت عملیات‌های غیرهمزمان یکی از چالش‌های اساسی است. دو روش اصلی برای مدیریت این نوع عملیات‌ها Promises و async/await هستند. هر دو ابزار قدرتمندی برای ساده‌تر کردن کدنویسی غیرهمزمان محسوب می‌شوند، اما تفاوت‌های قابل توجهی دارند که باید هنگام انتخاب یکی از آنها در نظر گرفته شود.

Promises چیست؟

Promises یک شیء در جاوااسکریپت است که نتیجه یک عملیات غیرهمزمان را نشان می‌دهد. این شیء سه حالت دارد:

  • Pending: عملیات هنوز کامل نشده است.
  • Resolved: عملیات با موفقیت کامل شده و مقدار بازگشتی آماده است.
  • Rejected: عملیات شکست خورده و خطا رخ داده است.

استفاده از Promises به کمک متدهای .then(), .catch(), و .finally() امکان‌پذیر است. مثال ساده:

const fetchData = () => {  
    return new Promise((resolve, reject) => {  
        setTimeout(() => {  
            resolve("داده دریافت شد");  
        }, 2000);  
    });  
};

fetchData()
    .then(data => console.log(data))
    .catch(err => console.error(err));

Async/Await چیست؟

async/await سینتکس مدرنی است که برای ساده‌تر کردن کار با Promises معرفی شد. این روش باعث خوانایی بیشتر کد می‌شود و شبیه به کدنویسی همزمان عمل می‌کند. تابعی که با کلیدواژه async تعریف شده باشد، همیشه یک Promise بازمی‌گرداند. کلیدواژه await نیز منتظر نتیجه Promise می‌ماند تا عملیات ادامه یابد.

مثال مشابه با استفاده از async/await:

const fetchData = async () => {
    try {
        const data = await new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve("داده دریافت شد");
            }, 2000);
        });
        console.log(data);
    } catch (err) {
        console.error(err);
    }
};

fetchData();

مزایا و معایب Promises

  • مزایا:
    • سازگاری بالا با نسخه‌های قدیمی‌تر جاوااسکریپت.
    • انعطاف‌پذیری در مدیریت چندین Promise با استفاده از متدهایی مثل Promise.all().
    • Mature بودن و پشتیبانی گسترده توسط جامعه توسعه‌دهندگان.
  • معایب:
    • Pyramid of Doom یا تو رفتگی‌های زیاد هنگام زنجیره‌سازی طولانی (Nesting Hell) در صورت عدم استفاده صحیح.
    • خوانایی پایین‌تر نسبت به async/await.
h