Skip to content

QuestQueue

صف کارهای ناهمگام با هم‌زمانی محدود. در هر لحظه دست‌بالا simultaneous کار اجرا می‌شود؛ بقیه می‌مانند و با پایان هر کار، جایی خالی پر می‌شود. برای بارگذاری‌ها یا درخواست‌های دسته‌ای به کارش ببرید: هر چیزی که نمی‌توانید یکجا رها کنید.

API

new QuestQueue({ simultaneous })

پارامترتوضیحنوعپیش‌فرض
simultaneousبیشترین هم‌زمانی؛ <= 0 یعنی ۱number1
عضوتوضیح
add(task)کاری را در صف می‌گذارد و Promise نتیجهٔ خودِ همان کار را می‌دهد. با خالی شدن جا آغاز می‌شود
allSettled(tasks)دسته‌ای را در صف می‌گذارد؛ مانند Promise.allSettled و به ترتیب ورودی برآورده می‌شود
onIdle()می‌ماند تا صف خالی شود
clear()هر چه هنوز آغاز نشده دور می‌ریزد (کارهای در حال اجرا دست‌نخورده می‌مانند)
running / pending / executed / idleشمارنده‌های زنده

نمونه

js
import { QuestQueue } from 'ranuts';

const queue = new QuestQueue({ simultaneous: 3 });
const results = await Promise.all(urls.map((url) => queue.add(() => fetch(url))));

// یا رها کنید و بروید، سپس چشم‌به‌راه همه بمانید، شکست‌ها هم در میان
urls.forEach((url) => queue.add(() => fetch(url)).catch(report));
await queue.onIdle();

یادداشت‌ها

  1. اولین ورودی، اولین خروجی: کارها به ترتیبی که افزوده شده‌اند اجرا می‌شوند.
  2. یک شکست صف را نمی‌خواباند. هر کار تنها Promise خودش را رد می‌کند و کار بعدی به‌هر‌روی آغاز می‌شود.
  3. کاری که همگام خطا پرتاب کند هم گرفته می‌شود، پس نمی‌تواند از add() بیرون بزند و شمارندهٔ هم‌زمانی را گیر بیندازد.
  4. allSettled ترتیب ورودی را نگه می‌دارد و هر پیامد را جداگانه گزارش می‌کند.

در ۰٫۳ از نو نوشته شد

پیاده‌سازی پیشین به کار نمی‌آمد. add() تنها در صف می‌گذاشت (برای اجرا باید دستی running() را صدا می‌زدید)؛ برداشت به شیوهٔ آخرین ورودی-اولین خروجی بود؛ یک Promise نتیجهٔ کارهای بی‌ربط را هم با خود می‌آورد؛ و allSettled نتیجه‌ها را از نمایهٔ ۱ می‌نوشت و با نخستین کار برآورده می‌شد. گزینهٔ total سازنده برداشته شده است: به‌جایش از onIdle() یا allSettled(tasks) استفاده کنید.

منتشرشده تحت مجوز MIT.