Signatur
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
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);
}
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));
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 · Fallstricke
- Browser-Kompatibilität: Chromium-Browser unterstützen
scheduler.postTask()ab Version 94 undscheduler.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 wiescheduler-polyfill. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung an
window.schedulerwird 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
AbortSignalab, wird das zurückgegebene Promise mit einemAbortErrorabgelehnt. Behandle diese Ablehnung mitcatch. - Nach
scheduler.yield()läuft der Code vor anderen Aufgaben gleicher Priorität weiter. Deshalb ist es als Ersatz fürsetTimeout(0)meist die bessere Wahl.