Chuyển đến nội dung chính
eLearner.app
Mô-đun 8 · Bài học 4 trong tổng số 432/32 trong khóa học~15 min
Bài học theo mô-đun (4/4)

Thách thức: lập lịch với Promises

"Scheduling" means deciding how to run a list of async tasks: all together, one at a time, or in small groups. We will combine Promise.all, for await, and closures.

In parallel: all together

When tasks are independent and fast, launch them all and wait with 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]

Total time ≈ time of the slowest task.

In series: one at a time

When each task depends on the previous one, or you want to rate-limit:

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

Total time ≈ sum of the times.

With a concurrency limit

Sometimes you do not want a thousand concurrent requests, but you do not want to wait for them in series either: you want a maximum of N in flight.

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;
}

The idea: you launch n "workers" that grab the next index until there is nothing left.

Try it

tập thể dục#js.m8.l4.e1
Nỗ lực: 0Đang tải…

Define `inSeries(tasks)` async: given an array of functions returning Promises, run them one at a time (await) and return the array of results in execution order.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

for ... of and push(await t())

Giải pháp khả dụng sau 3 lần thử

Review exercise

tập thể dục#js.m8.l4.e2
Nỗ lực: 0Đang tải…

Define `inParallel(tasks)` async: given an array of functions returning Promises, launch them all in parallel and return an array of results in the same order as the input. Use Promise.all.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

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

Giải pháp khả dụng sau 3 lần thử