من یک داشبور محاسباتی دارم که کاربر میتواند درخواست بررسی یک لیست از ایتمها را بدهد. نرم افزار باید در مقابل هر ایتم از این لیست یک سری کار انجام دهد و نتیجه را ثبت کند. من به دنبال راهی هستم که یک صف از وظایف به هم وابسته داشته باشم. زمانی که نیاز به اجرا داشتم یک کار جدید تعریف کنم و آن را به صف اضافه کنم. در نهایت زمانی که کار انجام شده به من بازخورد دهد.
1 پاسخ
در جاوا اسکریپت دو نوع صف وظیفه وجود دارد: صف میکرووظیفه و صف ماکرو وظیفه. در تصویر زیر نشون داده که این دو مدل چه تفاوتهایی با هم دارن:
حلقه رویداد یکی از بخشهایی هست که در مدیریت این تسکها کاربرد دارد. جاوا اسکریپت یک زبان تک رشته ای است، به این معنی که فقط می تواند یک کار را در یک زمان اجرا کند. برای جبران این مشکل، یک مدل ورودی/خروجی مبتنی بر رویداد و غیر مسدود کننده را برای مدیریت کارآمد عملیات ناهمزمان پیاده سازی کرده است. برای مدیریت اجرای این وظایف ناهمزمان، جاوا اسکریپت از مکانیزمی به نام حلقه رویداد استفاده می کند.
برای نمونه میتوان به setTimeout() اشاره کرد که در ارسال درخواست به سرورهای دور استفاده میشود. این مدل با انتقال تابع به API وب و گرفتن بازخورد از آن اجرا میشود. در تصویر زیر این ارتباط به صورت مرحله به مرحله نشان داده شده است:
پشته فراخوانی هم یکی دیگر از بخشهای مهم این مدل است. پشته فراخوانی یک ساختار داده است که وظیفه در حال اجرا را پیگیری میکند. هر زمان که یک تابع فراخوانی می شود، به پشته فراخوانی اضافه می شود و زمانی که یک تابع اجرای خود را کامل می کند، از پشته حذف می شود.
صف های وظیفهها، که به عنوان لیست وظایف یا صف پیام نیز شناخته می شوند، برای ذخیره وظایفی استفاده می شوند که بلافاصله اجرا نمی شوند اما باید توسط جاوا اسکریپت پردازش شوند. دو نوع اصلی صف وظایف در جاوا اسکریپت وجود دارد: صف microtask و صف macrotask.
صف microtask همانطور که از نام آن پیداست، وظایف ریز را انجام می دهد. وظایف ریز اولویت بیشتری دارند و بلافاصله پس از انجام وظیفه فعلی اجرا می شوند، اما قبل از اینکه وظیفه بعدی از صف رویداد برداشته شود. این تضمین می کند که ریزکارها در اسرع وقت پردازش می شوند.
صف macrotask وظایف کلان را انجام می دهد که در مقایسه با microtasks با اولویت کمتری اجرا می شوند. وظایف ماکرو تنها زمانی از صف رویداد برداشت میشوند که هیچ ریزتسکی در انتظار اجرا نباشد. این تضمین می کند که وظایف ماکرو عملیات حیاتی را مسدود نمی کند و برنامه را پاسخگو نگه می دارد.
برای این کار API های متفاوتی ارائه شده که میتوانید از آنها استفاده کنید.