Start · Sprachen · JavaScript · Referenz · new TaskController()

new TaskController()

Methode

Erstellt einen neuen <code>TaskController</code>, mit dem sich per <code>scheduler.postTask()</code> geplante Aufgaben abbrechen und in ihrer Priorität ändern lassen.

seit JavaScript Prioritized Task Scheduling API — Chrome/Edge 94+, Kategorie: webapi

Signatur

new TaskController(options)

Beschreibung

Der Konstruktor TaskController() gehört zur Prioritized Task Scheduling API. Er erzeugt einen Controller, dessen Eigenschaft signal ein TaskSignal enthält. Dieses Signal übergibst du an scheduler.postTask(). Damit kannst du Aufgaben später steuern.

TaskController erbt von AbortController. Du kannst also wie gewohnt abort() aufrufen, um alle verknüpften Aufgaben abzubrechen, die noch nicht ausgeführt wurden. Zusätzlich gibt es setPriority(): Damit änderst du die Priorität aller Aufgaben, die an dasselbe Signal gebunden sind, auch nachträglich. Das Signal löst dann das Ereignis prioritychange aus.

Über das optionale Objekt options legst du die Anfangspriorität fest. Möglich sind "user-blocking", "user-visible" (Standard) und "background". Ein Controller eignet sich besonders dann, wenn mehrere zusammengehörige Aufgaben gemeinsam abgebrochen oder umpriorisiert werden sollen. Ein Beispiel ist das Vorladen von Daten, das wichtiger wird, sobald der Nutzer mit einem Element interagiert.

Parameter

Name Typ Default Beschreibung
$options object {} Optionales Konfigurationsobjekt.
$options.priority "user-blocking" | "user-visible" | "background" "user-visible" Anfangspriorität des zugehörigen TaskSignal. Ein ungültiger Wert löst einen TypeError aus.

Rückgabewert

Typ
TaskController
Beschreibung
Ein neuer TaskController. Seine Eigenschaft signal ist ein TaskSignal mit der angegebenen Priorität.

Beispiele

Controller erzeugen und Priorität prüfen

const controller = new TaskController({ priority: 'background' });
console.log(controller.signal.priority);
console.log(controller.signal.aborted);

const standard = new TaskController();
console.log(standard.signal.priority);
background false user-visible

Hintergrundaufgabe bei Interaktion höher priorisieren

const controller = new TaskController({ priority: 'background' });

controller.signal.addEventListener('prioritychange', (event) => {
  console.log(`Priorität: ${event.previousPriority} → ${event.target.priority}`);
});

const task = scheduler.postTask(() => {
  // z. B. Daten für eine Detailansicht vorbereiten
  return 'Vorschau berechnet';
}, { signal: controller.signal });

// Nutzer fährt mit der Maus über den Link → dringender machen
document.querySelector('#details')?.addEventListener('pointerenter', () => {
  controller.setPriority('user-blocking');
}, { once: true });

console.log(await task);
Vorschau berechnet

Mehrere Aufgaben gemeinsam abbrechen

const controller = new TaskController();

const tasks = [1, 2, 3].map((n) =>
  scheduler.postTask(() => `Aufgabe ${n}`, { signal: controller.signal })
);

// Bevor die Aufgaben laufen: alles abbrechen
controller.abort();

const results = await Promise.allSettled(tasks);
results.forEach((r) => console.log(r.status, r.reason?.name));
rejected AbortError rejected AbortError rejected AbortError

Mit Feature-Erkennung und Fallback

const runLowPriority = (fn) => {
  if ('scheduler' in globalThis && 'TaskController' in globalThis) {
    const controller = new TaskController({ priority: 'background' });
    return {
      result: scheduler.postTask(fn, { signal: controller.signal }),
      cancel: () => controller.abort()
    };
  }
  // Fallback für Browser ohne Unterstützung
  let id;
  const result = new Promise((resolve) => { id = setTimeout(() => resolve(fn()), 0); });
  return { result, cancel: () => clearTimeout(id) };
};

const job = runLowPriority(() => 42);
console.log(await job.result);
42

// Wichtig · Fallstricke

  • Browser-Unterstützung: Chromium-Browser unterstützen die API ab Version 94, Firefox erst seit neueren Versionen. Safari unterstützt sie nicht. Prüfe deshalb immer mit 'TaskController' in globalThis und sieh einen Fallback vor. Die API ist auch in Web Workern verfügbar.
  • Ein ungültiger Wert für priority löst beim Konstruktor einen TypeError aus. Bei setPriority() ist es ebenfalls ein TypeError.
  • setPriority() aus einem prioritychange-Handler desselben Signals heraus aufzurufen, löst einen NotAllowedError aus.
  • abort() bricht nur Aufgaben ab, die noch nicht gestartet sind. Eine laufende synchrone Aufgabe wird nicht unterbrochen. Das Promise einer abgebrochenen Aufgabe wird mit einem AbortError (bzw. dem übergebenen Grund) abgelehnt. Fange diesen Fehler ab, sonst erscheinen unbehandelte Ablehnungen.
  • Wenn du keinen Controller brauchst, reicht scheduler.postTask(fn, { priority }). Die Priorität ist dann allerdings fest und lässt sich später nicht mehr ändern.
  • Ein abgebrochener Controller lässt sich nicht zurücksetzen. Für neue Aufgaben musst du einen neuen Controller erzeugen.