Signatur
Beschreibung
TaskSignal.any() ist eine statische Methode der Prioritized Task Scheduling API. Sie nimmt eine iterierbare Sammlung von AbortSignal-Objekten (also auch TaskSignals) entgegen und gibt ein neues TaskSignal zurück. Dieses Signal wird abgebrochen, sobald irgendeines der Eingangssignale abbricht; sein reason ist dann der Abbruchgrund dieses ersten Signals. Ist eines der Eingangssignale schon abgebrochen, ist das Ergebnis sofort abgebrochen.
Anders als AbortSignal.any() kann das Ergebnis zusätzlich eine Priorität tragen. Über das Optionsobjekt init.priority legst du entweder eine feste Priorität fest ("user-blocking", "user-visible", "background") oder übergibst ein anderes TaskSignal. Im zweiten Fall ist die Priorität dynamisch: Das neue Signal übernimmt jede Prioritätsänderung dieses Quellsignals und löst dabei selbst ein prioritychange-Ereignis aus.
Typische Anwendungsfälle sind Aufgaben für scheduler.postTask(), die sowohl durch Benutzeraktionen (z. B. einen Abbrechen-Knopf) als auch durch eine Zeitüberschreitung (AbortSignal.timeout()) beendet werden sollen und gleichzeitig mit einer bestimmten Priorität laufen müssen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $signals Pflicht | Iterable<AbortSignal> | Iterierbares Objekt (z. B. Array) von AbortSignal- bzw. TaskSignal-Objekten, deren Abbruch das neue Signal abbrechen soll. |
|
| $init | { priority?: "user-blocking" | "user-visible" | "background" | TaskSignal } | { priority: "user-visible" } | Optionsobjekt. priority ist entweder ein fester Prioritäts-String oder ein TaskSignal, dessen (sich ändernde) Priorität übernommen wird. |
Rückgabewert
TaskSignal, das abbricht, sobald eines der Eingangssignale abbricht, und die in init.priority festgelegte feste oder dynamische Priorität besitzt.Beispiele
Benutzerabbruch und Timeout kombinieren
const controller = new AbortController();
document.querySelector('#cancel').addEventListener('click', () => controller.abort());
// Abbruch durch Klick ODER nach 2 Sekunden, Priorität im Hintergrund
const signal = TaskSignal.any(
[controller.signal, AbortSignal.timeout(2000)],
{ priority: 'background' }
);
console.log(signal.priority);
try {
const result = await scheduler.postTask(() => {
// aufwendige Berechnung
return Array.from({ length: 1e5 }, (_, i) => i * i).length;
}, { signal });
console.log('Ergebnis:', result);
} catch (err) {
console.log('Abgebrochen:', err.name);
}
Dynamische Priorität von einem TaskController übernehmen
const taskController = new TaskController({ priority: 'user-visible' });
const userAbort = new AbortController();
// Priorität folgt taskController.signal
const combined = TaskSignal.any([userAbort.signal], {
priority: taskController.signal
});
combined.addEventListener('prioritychange', (e) => {
console.log(`Priorität: ${e.previousPriority} -> ${combined.priority}`);
});
taskController.setPriority('user-blocking');
Abbruchgrund auswerten
const a = new AbortController();
const b = new AbortController();
const signal = TaskSignal.any([a.signal, b.signal]);
signal.addEventListener('abort', () => {
console.log('Grund:', signal.reason);
});
b.abort('Seite verlassen');
console.log(signal.aborted, signal.priority);
Feature-Erkennung mit Rückfall auf AbortSignal.any()
const makeSignal = (signals, priority = 'user-visible') => {
if (typeof TaskSignal !== 'undefined' && typeof TaskSignal.any === 'function') {
return TaskSignal.any(signals, { priority });
}
// Rückfall: nur Abbruch, keine Priorität
return AbortSignal.any(signals);
};
const signal = makeSignal([AbortSignal.timeout(5000)], 'background');
console.log(signal instanceof AbortSignal);
// Wichtig · Fallstricke
- Browser-Kompatibilität: Nur in Chromium-basierten Browsern (Chrome/Edge/Opera ab Version 116) verfügbar. Safari unterstützt die Prioritized Task Scheduling API nicht, in Firefox ist die Unterstützung eingeschränkt bzw. neu. Immer per Feature-Erkennung prüfen und ggf. auf
AbortSignal.any()zurückfallen. - Die Priorität hat nur Auswirkung, wenn das Signal an
scheduler.postTask()(oderscheduler.yield()-Vererbung) übergeben wird; beifetch()wird sie ignoriert, nur der Abbruch zählt. - Die Priorität wird nicht aus den Eingangssignalen in
signalsabgeleitet, sondern ausschließlich ausinit.priority. Ohne Angabe gilt"user-visible". - Ein ungültiger Prioritäts-String wirft einen
TypeError. - Ist bereits ein Eingangssignal abgebrochen, wird das Ergebnis sofort abgebrochen erzeugt – ein
abort-Ereignis wird dann nicht mehr ausgelöst. Prüfe daher zusätzlichsignal.aborted. - Das Ergebnis hält Verweise auf die Quellsignale; bei sehr vielen kurzlebigen Kombinationen auf Speicherverbrauch achten.