Signatur
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
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' });
}
});
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 }));
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 });
}
};
// 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,nulloder bereits abgelaufene IDs lösen keinen Fehler aus. Deshalb kannclearTimeout()gefahrlos „auf Verdacht“ aufgerufen werden. - Austauschbar mit
clearInterval(): Laut Spezifikation teilen sichsetTimeout()undsetInterval()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_threadsgibtsetTimeout()einTimeout-Objekt statt einer Zahl zurück;clearTimeout()akzeptiert dort dieses Objekt.