Start · Sprachen · JavaScript · Referenz · WorkerGlobalScope.clearTimeout()

WorkerGlobalScope.clearTimeout()

Methode

Bricht einen zuvor mit <code>setTimeout()</code> im Worker registrierten Timer ab, bevor dessen Callback ausgeführt wird.

seit JavaScript Baseline: alle Browser (Web Worker, Service Worker Kategorie: webapi

Signatur

WorkerGlobalScope.clearTimeout(timeoutID)

Beschreibung

Mit clearTimeout() brechen Sie innerhalb eines Workers (Dedicated Worker, Shared Worker oder Service Worker) einen Timer ab, den Sie vorher mit setTimeout() gestartet haben. Als Argument übergeben Sie die numerische ID, die setTimeout() zurückgegeben hat. Hat der Timer noch nicht ausgelöst, wird sein Callback nicht mehr ausgeführt.

Im Worker ist die Methode direkt über den globalen Kontext erreichbar, also als clearTimeout(id) oder self.clearTimeout(id). Sie verhält sich wie Window.clearTimeout() im Hauptthread, arbeitet aber nur mit den Timer-IDs des eigenen Workers.

Typische Anwendungsfälle sind Zeitlimits für lange Berechnungen oder Netzwerkanfragen, das Entprellen (Debouncing) eingehender Nachrichten aus postMessage() und das Aufräumen ausstehender Timer, bevor sich der Worker mit close() selbst beendet.

Parameter

Name Typ Default Beschreibung
$timeoutID number | undefined undefined Die ID des Timers, die setTimeout() im selben Worker zurückgegeben hat. Ungültige, bereits abgelaufene oder fehlende IDs werden stillschweigend ignoriert.

Rückgabewert

Typ
void
Beschreibung
Kein Rückgabewert (undefined).

Beispiele

Timeout für eine Berechnung im Worker abbrechen

// worker.js
let timeoutId = null;

self.addEventListener('message', (event) => {
  if (event.data.type === 'start') {
    // Nach 5 Sekunden Abbruch melden, falls nicht vorher fertig
    timeoutId = setTimeout(() => {
      self.postMessage({ type: 'timeout' });
    }, 5000);
  }

  if (event.data.type === 'done') {
    clearTimeout(timeoutId);
    timeoutId = null;
    self.postMessage({ type: 'ok' });
  }
});
{ type: 'ok' } (wenn 'done' vor Ablauf der 5 Sekunden eintrifft)

Debouncing eingehender Nachrichten

// worker.js – verarbeitet Suchbegriffe erst nach 300 ms Ruhe
let debounceId;

self.onmessage = ({ data }) => {
  clearTimeout(debounceId); // vorherigen Timer verwerfen
  debounceId = setTimeout(() => {
    const result = data.query.toUpperCase();
    self.postMessage(result);
  }, 300);
};

// main.js
const worker = new Worker('worker.js');
worker.onmessage = (e) => console.log('Ergebnis:', e.data);
['j', 'ja', 'jav', 'java'].forEach((q) => worker.postMessage({ query: q }));
Ergebnis: JAVA

Fetch mit Zeitlimit im Worker

// worker.js
const fetchWithTimeout = async (url, ms) => {
  const controller = new AbortController();
  const id = setTimeout(() => controller.abort(), ms);
  try {
    const response = await fetch(url, { signal: controller.signal });
    return await response.json();
  } finally {
    clearTimeout(id); // Timer immer aufräumen
  }
};

self.onmessage = async ({ data }) => {
  try {
    const json = await fetchWithTimeout(data.url, 3000);
    self.postMessage({ ok: true, json });
  } catch (err) {
    self.postMessage({ ok: false, error: err.name });
  }
};
{ ok: false, error: 'AbortError' } (bei Überschreitung von 3 s)

// Wichtig · Fallstricke

  • Nur eigener Kontext: Timer-IDs gelten nur im Worker, der sie erzeugt hat. Eine ID aus dem Hauptthread oder aus einem anderen Worker bricht dort nichts ab.
  • Fehlertolerant: Ungültige Werte wie undefined, null oder bereits abgelaufene IDs lösen keinen Fehler aus. Deshalb kann clearTimeout() gefahrlos „auf Verdacht“ aufgerufen werden.
  • Austauschbar mit clearInterval(): Laut Spezifikation teilen sich setTimeout() und setInterval() denselben ID-Pool. Aus Gründen der Lesbarkeit sollten Sie trotzdem die jeweils passende Methode verwenden.
  • Service Worker: Der Browser kann einen untätigen Service Worker jederzeit beenden. Dann laufen ausstehende Timer ohnehin nicht mehr. Für länger dauernde Aufgaben sollten Sie deshalb nicht auf setTimeout() setzen, sondern z. B. event.waitUntil() verwenden.
  • Kompatibilität: Wird in allen modernen Browsern in jeder Art von Worker unterstützt. In Node.js worker_threads gibt setTimeout() ein Timeout-Objekt statt einer Zahl zurück; clearTimeout() akzeptiert dort dieses Objekt.