Skip to main content
eLearner.app
Module 8 · Lesson 4 of 432/32 in the course~15 min
Module lessons (4/4)

Challenge: scheduling with 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

Exercise#js.m8.l4.e1
Attempts: 0Loading…

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.

Loading editor…
Show hint

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

Solution available after 3 attempts

Review exercise

Exercise#js.m8.l4.e2
Attempts: 0Loading…

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.

Loading editor…
Show hint

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

Solution available after 3 attempts