Promiseها

Promiseها

متوسط

مقدمه

پیش از آنکه کلاس Promise معرفی شود، فقط یک راه برای برخورد با کد غیرهمگام وجود داشت: «الگوی کالبک».

کالبک تابعی است که به عنوان آرگومان به تابعی دیگر داده می‌شود و زمانی فراخوانی می‌شود که کاری در آن تابع دیگر تمام شده باشد. الگوی رایج در این توابع کالبک آن است که یک «خطا» را به عنوان پارامتر اول می‌پذیرند (به مثال زیر نگاه کنید).

function callback(error, arg2, arg3) {}

این موضوع چه ربطی به کد غیرهمگام دارد؟

از نظر تاریخی، از کالبک‌ها استفاده می‌شد تا بتوانیم پس از پایان یک کار غیرهمگام و بدون مسدود کردن کل برنامه، کارهایی انجام دهیم.

fetchProduct(productId, function (error, data) {
  if (error) {
    // Handle the error
  } else {
    // Do some work
  }
});

در مثال بالا، تابع fetchProduct (که غیرهمگام است) یک کالبک را به عنوان آرگومان دوم می‌گیرد که تعیین می‌کند وقتی داده‌های محصول دریافت شد چه کاری انجام شود.

دستورالعمل‌ها

این تمرین دو هدف دارد:

۱. تابعی به اسم promisify پیاده‌سازی کنید که تابعی را که از «الگوی callback» استفاده می‌کند به تابعی تبدیل می‌کند که یک Promise برمی‌گرداند. مثال زیر را ببینید.

function fetchProduct(productId, function(error, data) {
    if (error) {
        // Handle the error
    } else {
        // Make something with your data
    }
})

const fetchProductAsPromise = promisify(fetchProduct);

// Now you got a function `fetchProductAsPromise`
// that returns a promise
fetchProductAsPromise(productId)
    .then((data) => {})
    .catch((error) => {});

۲. متدهای توکار Promise زیر را دوباره پیاده‌سازی کنید (بدون اینکه از آن‌ها استفاده کنید)

  • all: آرایه‌ای از Promiseها می‌گیرد؛ وقتی همه‌ی آن‌ها resolve شوند، resolve می‌شود و وقتی یکی از آن‌ها reject شود، reject می‌شود.
  • allSettled: آرایه‌ای از Promiseها می‌گیرد؛ وقتی همه‌ی آن‌ها یا resolve شوند یا reject، resolve می‌شود.
  • race: آرایه‌ای از Promiseها می‌گیرد و با مقدار اولین Promiseی که resolve یا reject می‌شود، resolve یا reject می‌شود.
  • any: آرایه‌ای از Promiseها می‌گیرد؛ وقتی یکی از آن‌ها resolve شود، resolve می‌شود و وقتی همه‌ی آن‌ها reject شوند، reject می‌شود.
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
JavaScript Exercism

آماده‌اید Promiseها را شروع کنید؟

در Exercism ثبت‌نام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.