Signatur
Beschreibung
Die Methode clearInterval() der Schnittstelle WorkerGlobalScope stoppt einen Intervall-Timer, der vorher im selben Worker mit setInterval() angelegt wurde. Danach wird der Callback nicht mehr aufgerufen. Im Worker ist die Methode direkt global verfügbar, also als clearInterval() oder self.clearInterval(). Das gilt für dedizierte Worker, Shared Worker und Service Worker.
Übergeben wird die numerische Kennung, die setInterval() zurückgegeben hat. Sinnvoll ist die Methode z. B. bei Polling-Schleifen, Heartbeat-Nachrichten an den Hauptthread oder Fortschrittsmeldungen, die aufhören sollen, sobald eine Aufgabe fertig ist oder der Hauptthread eine Stopp-Nachricht schickt.
Timer-Kennungen gelten nur im jeweiligen globalen Kontext. Eine im Worker erzeugte ID lässt sich also nicht im Hauptthread mit window.clearInterval() stoppen und umgekehrt auch nicht. Stoppen Sie Intervalle deshalb immer in dem Kontext, in dem sie gestartet wurden, oder schicken Sie per postMessage() eine Aufforderung dorthin.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $intervalID | number | Kennung des Intervalls, die setInterval() zurückgegeben hat. Bei einer ungültigen oder bereits gelöschten ID sowie bei undefined passiert nichts, und es wird kein Fehler ausgelöst. |
Rückgabewert
undefined zurück.Beispiele
Intervall nach fester Anzahl von Durchläufen stoppen
// worker.js
let zaehler = 0;
const id = setInterval(() => {
zaehler++;
postMessage(`Tick ${zaehler}`);
if (zaehler === 3) {
clearInterval(id);
postMessage('Intervall beendet');
}
}, 1000);
Heartbeat per Nachricht aus dem Hauptthread starten und stoppen
// worker.js
let heartbeatId = null;
self.addEventListener('message', ({ data }) => {
if (data === 'start' && heartbeatId === null) {
heartbeatId = setInterval(() => postMessage({ typ: 'heartbeat', zeit: Date.now() }), 2000);
}
if (data === 'stop') {
clearInterval(heartbeatId);
heartbeatId = null; // erlaubt einen erneuten Start
postMessage({ typ: 'gestoppt' });
}
});
// main.js
const worker = new Worker('worker.js');
worker.onmessage = (e) => console.log(e.data);
worker.postMessage('start');
setTimeout(() => worker.postMessage('stop'), 5000);
Polling beenden, sobald ein Ergebnis vorliegt
// worker.js
const pollId = setInterval(async () => {
try {
const res = await fetch('/api/job/42');
const job = await res.json();
if (job.status === 'fertig') {
clearInterval(pollId);
postMessage(job);
}
} catch (err) {
clearInterval(pollId);
postMessage({ fehler: err.message });
}
}, 3000);
// Wichtig · Fallstricke
- Kontextgebunden: Timer-IDs aus dem Worker gelten nicht im Hauptthread und auch nicht in anderen Workern. Ein Aufruf mit einer fremden ID bleibt ohne Wirkung und meldet keinen Fehler.
- Gemeinsamer ID-Pool:
setTimeout()undsetInterval()teilen sich die Kennungen. Deshalb kannclearInterval()technisch auch einen Timeout löschen und umgekehrt. Verwenden Sie trotzdem die passende Methode, damit der Code lesbar bleibt. - Asynchrone Callbacks:
clearInterval()bricht einen Callback nicht ab, der gerade läuft, also z. B. keinfetch, auf das noch gewartet wird. Es verhindert nur weitere Aufrufe. Lange asynchrone Arbeit brechen Sie bei Bedarf mit einemAbortControllerab. - Überlappung: Dauert ein asynchroner Callback länger als das Intervall, laufen mehrere Durchläufe gleichzeitig. Hier ist ein rekursives
setTimeout()oft die bessere Wahl. - Worker beenden:
self.close()oderworker.terminate()stoppt automatisch alle Timer. Service Worker können der Browser jederzeit anhalten, deshalb sind Intervalle dort grundsätzlich unzuverlässig. - Kompatibilität: Wird von allen modernen Browsern in Workern unterstützt, ebenso von Deno. In Node.js gibt es ein eigenes Timer-Modell mit
Timeout-Objekten statt Zahlen.