Direkt zum Hauptinhalt springen
eLearner.app
Modul 8 · Lektion 4 von 432/32 im Kurs~15 min
Lektionen des Moduls (4/4)

Herausforderung: Planung mit Promises

„Scheduling“ bedeutet zu entscheiden, wie eine Liste asynchroner Aufgaben (Tasks) ausgeführt werden soll: alle auf einmal, nacheinander oder in kleinen Gruppen. Wir kombinieren hierfür Promise.all, for await und Closures.

Parallel: Alle auf einmal

Wenn die Aufgaben unabhängig und schnell sind, starte sie alle gleichzeitig und warte mit Promise.all auf sie:

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]

Gesamtzeit ≈ Zeit des langsamsten Tasks.

Seriell: Nacheinander

Wenn jeder Task vom vorherigen abhängt oder du ein Rate-Limit einhalten willst:

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

Gesamtzeit ≈ Summe der Einzelzeiten.

Mit Nebenläufigkeitsbegrenzung (Concurrency Limit)

Manchmal möchtest du weder tausend Anfragen gleichzeitig senden noch sie nacheinander abarbeiten: Du möchtest maximal N aktive Anfragen gleichzeitig laufen haben.

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

Idee: Du startest n „Worker“, die sich jeweils den nächsten Index holen, solange noch Aufgaben vorhanden sind.

Probier es aus

Übung#js.m8.l4.e1
Versuche: 0Wird geladen…

Definiere `inSeries(tasks)` als async: Erhält ein Array von Funktionen, die Promises zurückgeben. Führe sie nacheinander aus (await) und gib das Array der Ergebnisse in der Reihenfolge der Ausführung zurück.

Editor wird geladen…
Hinweis anzeigen

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

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#js.m8.l4.e2
Versuche: 0Wird geladen…

Definiere `inParallel(tasks)` als async: Erhält ein Array von Funktionen, die Promises zurückgeben. Starte alle parallel und gib ein Array der Ergebnisse in derselben Reihenfolge wie die Eingabe zurück. Verwende Promise.all.

Editor wird geladen…
Hinweis anzeigen

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

Lösung nach 3 Versuchen verfügbar