Signatur
Beschreibung
Das Ereignis prioritychange gehört zur Prioritized Task Scheduling API. Es wird an ein TaskSignal gesendet, nachdem sich dessen Priorität geändert hat. Meist geschieht das, weil der zugehörige TaskController setPriority() aufruft. Alle Aufgaben, die mit scheduler.postTask() und diesem Signal eingeplant wurden, werden dann mit der neuen Priorität ("user-blocking", "user-visible" oder "background") weiter ausgeführt.
Den Handler registriert man mit signal.addEventListener("prioritychange", handler) oder über die Eigenschaft signal.onprioritychange. Der Handler bekommt ein TaskPriorityChangeEvent. Dessen Eigenschaft previousPriority enthält die alte Priorität. Die neue Priorität liest man aus event.target.priority bzw. signal.priority.
Typische Anwendungen: UI-Zustände oder Protokolle aktualisieren, wenn eine Hintergrundaufgabe plötzlich dringend wird (z. B. weil der Nutzer einen Bereich öffnet). Oder abhängige Arbeit neu planen, wenn eine Aufgabe in den Hintergrund zurückgestuft wird. Auch Signale aus TaskSignal.any(signals, { priority: quellSignal }) übernehmen die Priorität des Quellsignals und senden dabei ebenfalls prioritychange.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname "prioritychange". |
|
| $handler Pflicht | (event: TaskPriorityChangeEvent) => void | Rückruffunktion. Sie bekommt ein TaskPriorityChangeEvent mit der Eigenschaft previousPriority ("user-blocking" | "user-visible" | "background"). |
|
| $options | boolean | AddEventListenerOptions | false | Übliche Listener-Optionen wie once oder signal, mit denen sich der Listener automatisch wieder entfernen lässt. |
Rückgabewert
addEventListener() gibt nichts zurück. Der Handler bekommt ein TaskPriorityChangeEvent.Beispiele
Prioritätswechsel mit addEventListener beobachten
const controller = new TaskController({ priority: 'background' });
controller.signal.addEventListener('prioritychange', (event) => {
const vorher = event.previousPriority;
const nachher = event.target.priority;
console.log(`Priorität geändert: ${vorher} -> ${nachher}`);
});
controller.setPriority('user-blocking');
Handler über die Eigenschaft onprioritychange setzen
const controller = new TaskController();
controller.signal.onprioritychange = (event) => {
console.log('Alt:', event.previousPriority, '| Neu:', controller.signal.priority);
};
controller.setPriority('background');
// Handler wieder entfernen
controller.signal.onprioritychange = null;
Hintergrundaufgabe bei Nutzerinteraktion hochstufen und Listener entfernen
if ('scheduler' in globalThis && 'TaskController' in globalThis) {
const controller = new TaskController({ priority: 'background' });
const onChange = (event) => {
console.log(`Vorschau-Aufgabe jetzt "${event.target.priority}" (vorher "${event.previousPriority}")`);
};
controller.signal.addEventListener('prioritychange', onChange);
const aufgabe = scheduler.postTask(() => {
return 'Vorschau berechnet';
}, { signal: controller.signal });
// Nutzer öffnet die Vorschau -> Aufgabe wird dringend
controller.setPriority('user-blocking');
const ergebnis = await aufgabe;
console.log(ergebnis);
controller.signal.removeEventListener('prioritychange', onChange);
} else {
console.log('Prioritized Task Scheduling API nicht verfügbar');
}
// Wichtig · Fallstricke
- Browser-Unterstützung: In Chromium-Browsern ab Version 94 vorhanden, in Firefox erst in neueren Versionen. Safari unterstützt es nicht. Deshalb vorher mit
'TaskController' in globalThisprüfen, ob die API verfügbar ist. - Wird
setPriority()mit der gleichen Priorität aufgerufen, die schon gilt, wird kein Ereignis gesendet. - Wer
setPriority()innerhalb einesprioritychange-Handlers für dasselbe Signal aufruft, bekommt eineDOMExceptionvom TypNotAllowedError. Rekursive Prioritätswechsel sind also nicht möglich. - Das Ereignis wird synchron während
setPriority()gesendet. Beim Aufruf des Handlers istsignal.prioritybereits auf den neuen Wert gesetzt. Die alte Priorität steht nur inevent.previousPriority. - Ein
TaskSignalohne zugehörigenTaskController(z. B.AbortSignaloder ein festes Prioritäts-Signal) sendet dieses Ereignis nie. - Das Abbrechen über
controller.abort()löstabortaus, nichtprioritychange.