Direct naar de hoofdinhoud
Module 8 · Les 4 van 432/32 in de cursus~15 min
Modulelessen (4/4)

Uitdaging: plannen met Promises

"Plannen" betekent beslissen hoe een lijst met asynchrone taken moet worden uitgevoerd: allemaal samen, één voor één, of in kleine groepen. We combineren Promise.all, for await en sluitingen.

Parallel: allemaal samen

Wanneer taken onafhankelijk en snel zijn, start u ze allemaal en wacht u met 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]

Totale tijd ≈ tijd van de langzaamste taak.

In serie: één voor één

Wanneer elke taak afhankelijk is van de vorige, of als u een snelheidslimiet wilt instellen:

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

Totale tijd ≈ som van de tijden.

Met een gelijktijdigheidslimiet

Soms wil je geen duizend gelijktijdige aanvragen, maar wil je er ook niet op wachten serie ofwel: je wilt een maximaal N tijdens de vlucht.

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

Het idee: je lanceert n "werkers" die de volgende index pakken totdat er niets meer over is.

Probeer het

Oefening#js.m8.l4.e1
Pogingen: 0Laden…

Definieer `inSeries(tasks)` async: gegeven een reeks functies die beloften retourneren, voert u ze één voor één uit (wachten) en retourneert u de reeks resultaten in uitvoeringsvolgorde.

Editor laden…
Toon hint

voor ... van en push(wacht op t())

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#js.m8.l4.e2
Pogingen: 0Laden…

Definieer `inParallel(taken)` async: gegeven een reeks functies die beloften retourneren, start u ze allemaal parallel en retourneert u een reeks resultaten in dezelfde volgorde als de invoer. Gebruik Promise.all.

Editor laden…
Toon hint

Belofte.all(taken.map((t) => t()))

Oplossing beschikbaar na 3 pogingen