Passer au contenu principal
eLearner.app
Module 8 · Leçon 4 sur 432/32 dans le cours~15 min
Leçons du module (4/4)

Défi : planification avec des Promesses

L'« ordonnancement » (scheduling) consiste à décider de la manière d'exécuter une liste de tâches asynchrones : toutes en même temps, une par une, ou par petits groupes. Nous allons combiner Promise.all, for await et des fermetures (closures).

En parallèle : tout en même temps

Lorsque les tâches sont indépendantes et rapides, lancez-les toutes et attendez-les avec 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]

Temps total ≈ temps de la tâche la plus lente.

En série : une par une

Lorsque chaque tâche dépend de la précédente, ou si vous souhaitez limiter le débit (rate-limit) :

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

Temps total ≈ somme des temps individuels.

Avec limite de concurrence

Parfois, vous ne voulez pas lancer mille requêtes simultanées, mais pas non plus les attendre en série : vous souhaitez avoir un maximum de N requêtes actives.

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

Idée : vous lancez n « workers » qui récupèrent l'indice suivant tant qu'il reste du travail à faire.

À vous de jouer

Exercice#js.m8.l4.e1
Tentatives : 0Chargement…

Définissez `inSeries(tasks)` en mode async : à partir d'un tableau de fonctions retournant des Promises, exécutez-les une par une (await) et retournez le tableau des résultats dans l'ordre d'exécution.

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives

Exercice de révision

Exercice#js.m8.l4.e2
Tentatives : 0Chargement…

Définissez `inParallel(tasks)` en mode async : à partir d'un tableau de fonctions retournant des Promises, lancez-les toutes en parallèle et retournez un tableau de leurs résultats dans le même ordre que l'entrée. Utilisez Promise.all.

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives