Start · Sprachen · JavaScript · Referenz · Window.scheduler

Window.scheduler

Eigenschaft

Schreibgeschützte Eigenschaft, die das globale <code>Scheduler</code>-Objekt der Prioritized Task Scheduling API liefert, um Aufgaben mit Priorität einzuplanen.

seit JavaScript Chrome/Edge 94+, Firefox 142+; Safari: nicht unter Kategorie: webapi

Signatur

Window.scheduler

Beschreibung

Die schreibgeschützte Eigenschaft window.scheduler gibt das Scheduler-Objekt des aktuellen Fensters zurück. Sie ist der Einstiegspunkt der Prioritized Task Scheduling API, mit der sich Aufgaben in drei Prioritätsstufen einplanen lassen: "user-blocking", "user-visible" (Standard) und "background".

Über scheduler.postTask() planst du Aufgaben ein, die der Browser nach ihrer Priorität abarbeitet. Das ist genauer und leichter zu steuern als setTimeout() oder requestIdleCallback(). Mit scheduler.yield() gibst du innerhalb einer langen Aufgabe kurz den Hauptthread frei. So kann der Browser Eingaben verarbeiten und neu zeichnen, und die Reaktionsfähigkeit der Seite verbessert sich (z. B. der INP-Wert).

Diese Eigenschaft ist auch in Web Workern verfügbar, dort als WorkerGlobalScope.scheduler. Im Code greift man meist direkt über das globale scheduler darauf zu. Weil nicht jeder Browser die API unterstützt, solltest du immer vorher prüfen, ob sie vorhanden ist ('scheduler' in globalThis), und sonst eine Ersatzlösung einsetzen.

Rückgabewert

Typ
Scheduler
Beschreibung
Das Scheduler-Objekt des Fensters mit den Methoden postTask() und yield(). In Browsern ohne Unterstützung ist die Eigenschaft undefined.

Beispiele

Prüfen, ob die API vorhanden ist, und eine Aufgabe einplanen

if ('scheduler' in globalThis && 'postTask' in scheduler) {
  const ergebnis = await scheduler.postTask(
    () => 'Analytics gesendet',
    { priority: 'background' }
  );
  console.log(ergebnis);
} else {
  // Ersatzlösung für ältere Browser
  setTimeout(() => console.log('Analytics gesendet (Fallback)'), 0);
}
Analytics gesendet

Lange Schleife mit scheduler.yield() aufteilen

const yieldToMain = () =>
  globalThis.scheduler?.yield
    ? scheduler.yield()
    : new Promise((resolve) => setTimeout(resolve, 0));

const verarbeiteEintraege = async (eintraege) => {
  let summe = 0;
  for (const [i, wert] of eintraege.entries()) {
    summe += wert;
    // alle 500 Einträge den Hauptthread freigeben
    if (i % 500 === 0) await yieldToMain();
  }
  return summe;
};

const daten = Array.from({ length: 5000 }, (_, i) => i);
console.log(await verarbeiteEintraege(daten));
12497500

Prioritäten und Abbruch mit TaskController

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

scheduler.postTask(() => console.log('Hintergrund'), { signal: controller.signal })
  .catch((err) => console.log('Abgebrochen:', err.name));

scheduler.postTask(() => console.log('Wichtig'), { priority: 'user-blocking' });

// Priorität der Hintergrundaufgabe nachträglich anheben
controller.setPriority('user-visible');

// Oder abbrechen:
// controller.abort();
Wichtig Hintergrund

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Chromium-Browser unterstützen scheduler.postTask() ab Version 94 und scheduler.yield() ab Version 129. Firefox unterstützt die API erst in neueren Versionen, Safari gar nicht (Stand 2025). Prüfe deshalb immer, ob die API vorhanden ist, oder nutze ein Polyfill wie scheduler-polyfill.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung an window.scheduler wird ignoriert.
  • Prioritäten gelten nur für Aufgaben, die über den Scheduler eingeplant wurden. Eine bereits laufende Aufgabe mit langem synchronem Code wird dadurch nicht unterbrochen. Lange Aufgaben musst du selbst mit scheduler.yield() aufteilen.
  • Bricht man eine Aufgabe über ein AbortSignal ab, wird das zurückgegebene Promise mit einem AbortError abgelehnt. Behandle diese Ablehnung mit catch.
  • Nach scheduler.yield() läuft der Code vor anderen Aufgaben gleicher Priorität weiter. Deshalb ist es als Ersatz für setTimeout(0) meist die bessere Wahl.