同時実行数に上限のある、非同期タスクのキューです。同時に走るのは多くても simultaneous 個で、残りは待ち、ひとつ終わるたびに空いた枠が埋まります。まとめてのアップロードやリクエストなど、一度に全部は投げられない場面で使ってください。
| パラメーター |
説明 |
型 |
既定値 |
simultaneous |
同時実行数の上限。<= 0 は 1 とみなされます |
number |
1 |
| メンバー |
説明 |
add(task) |
タスクを積み、そのタスク自身の 結果の Promise を受け取ります。枠が空き次第、走り始めます |
allSettled(tasks) |
まとめて積みます。Promise.allSettled と同じように、渡した順で解決されます |
onIdle() |
キューが空になるまで待ちます |
clear() |
まだ始まっていないものをすべて捨てます(走っているタスクはそのままです) |
running / pending / executed / idle |
現在の状況を示すカウンター |
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 だけを reject し、次のタスクはかまわず走り始めます。
- 同期的に例外を投げるタスクも捕まえます。 ですから
add() の外へ漏れて、同時実行数のカウンターが詰まったままになることはありません。
allSettled は渡した順を保ち、それぞれの結果を別々に報告します。