メインコンテンツにスキップ
モジュール 8 · レッスン 4 / 4コース内の 32/32~15 min
モジュールのレッスン (4/4)

課題: Promise を使用したスケジュール設定

「スケジューリング」とは、非同期タスクのリストを実行する方法を決定することを意味します。一度に 1 つずつ、すべてをまとめて実行します。 または小グループで。 Promise.all、for await、およびクロージャを組み合わせます。

並行して:すべて一緒に

タスクが独立で高速な場合は、すべてを起動して Promise.all で待機します。

JS
async function inParallelo(tasks) {
  return Promise.all(tasks.map((t) => t()));
}

const risultati = await inParallelo([
  () => Promise.resolve(1),
  () => Promise.resolve(2),
  () => Promise.resolve(3),
]);
// [1, 2, 3]

合計時間 ≈ 最も遅いタスクの時間。

シリーズで: 一度に 1 つずつ

各タスクが前のタスクに依存している場合、またはレート制限したい場合:

JS
async function inSerie(tasks) {
  const risultati = [];
  for (const t of tasks) {
    risultati.push(await t());
  }
  return risultati;
}

合計時間 ≈ 合計 時間。

同時実行制限あり

場合によっては、1,000 の同時リクエストを望まないが、それらのリクエストを長時間待ちたくない場合があります。 シリーズのいずれか: 飛行中に最大 N が必要。

JS
async function conLimite(tasks, n) {
  const risultati = new Array(tasks.length);
  let i = 0;
  async function worker() {
    while (i < tasks.length) {
      const mio = i++;
      risultati[mio] = await tasks[mio]();
    }
  }
  await Promise.all(Array.from({ length: n }, worker));
  return risultati;
}

アイデアは、n「ワーカー」を起動し、何もなくなるまで次のインデックスを取得するというものです。

試してみてください

運動#js.m8.l4.e1
試行回数: 0読み込み中…

`inSeries(tasks)` を async で定義します。Promise を返す関数の配列が与えられた場合、それらを一度に 1 つずつ実行し (await)、実行順序に従って結果の配列を返します。

エディターを読み込み中…
ヒントを表示

for ... of と Push(await t())

3 回の試行後に解決策が利用可能になります

復習演習

運動#js.m8.l4.e2
試行回数: 0読み込み中…

`inParallel(tasks)` を async で定義します。Promise を返す関数の配列が与えられた場合、それらをすべて並列に起動し、入力と同じ順序で結果の配列を返します。 Promise.all を使用します。

エディターを読み込み中…
ヒントを表示

Promise.all(tasks.map((t) => t()))

3 回の試行後に解決策が利用可能になります