QuestQueue
صف کارهای ناهمگام با همزمانی محدود. در هر لحظه دستبالا simultaneous کار اجرا میشود؛ بقیه میمانند و با پایان هر کار، جایی خالی پر میشود. برای بارگذاریها یا درخواستهای دستهای به کارش ببرید: هر چیزی که نمیتوانید یکجا رها کنید.
API
new QuestQueue({ simultaneous })
| پارامتر | توضیح | نوع | پیشفرض |
|---|---|---|---|
simultaneous | بیشترین همزمانی؛ <= 0 یعنی ۱ | number | 1 |
| عضو | توضیح |
|---|---|
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();یادداشتها
- اولین ورودی، اولین خروجی: کارها به ترتیبی که افزوده شدهاند اجرا میشوند.
- یک شکست صف را نمیخواباند. هر کار تنها Promise خودش را رد میکند و کار بعدی بههرروی آغاز میشود.
- کاری که همگام خطا پرتاب کند هم گرفته میشود، پس نمیتواند از
add()بیرون بزند و شمارندهٔ همزمانی را گیر بیندازد. allSettledترتیب ورودی را نگه میدارد و هر پیامد را جداگانه گزارش میکند.
در ۰٫۳ از نو نوشته شد
پیادهسازی پیشین به کار نمیآمد. add() تنها در صف میگذاشت (برای اجرا باید دستی running() را صدا میزدید)؛ برداشت به شیوهٔ آخرین ورودی-اولین خروجی بود؛ یک Promise نتیجهٔ کارهای بیربط را هم با خود میآورد؛ و allSettled نتیجهها را از نمایهٔ ۱ مینوشت و با نخستین کار برآورده میشد. گزینهٔ total سازنده برداشته شده است: بهجایش از onIdle() یا allSettled(tasks) استفاده کنید.