Start · Sprachen · JavaScript · Referenz · TaskSignal.any()

TaskSignal.any()

Methode

Erzeugt ein <code>TaskSignal</code>, das abbricht, sobald eines der übergebenen <code>AbortSignal</code>-Objekte abbricht, und optional eine feste oder dynamische Priorität trägt.

seit JavaScript Chrome/Edge 116+ (Prioritized Task Scheduling API, Kategorie: webapi

Signatur

TaskSignal.any(signals, init)

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

Typ
TaskSignal
Beschreibung
Ein neues 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);
}
background Ergebnis: 100000

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');
Priorität: user-visible -> 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);
Grund: Seite verlassen true user-visible

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);
true

// 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() (oder scheduler.yield()-Vererbung) übergeben wird; bei fetch() wird sie ignoriert, nur der Abbruch zählt.
  • Die Priorität wird nicht aus den Eingangssignalen in signals abgeleitet, sondern ausschließlich aus init.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ätzlich signal.aborted.
  • Das Ergebnis hält Verweise auf die Quellsignale; bei sehr vielen kurzlebigen Kombinationen auf Speicherverbrauch achten.