Signatur
Beschreibung
Die Methode close() wird innerhalb eines Shared Workers aufgerufen, meist einfach als self.close() oder close(). Sie verwirft alle Aufgaben, die noch in der Ereignisschleife des SharedWorkerGlobalScope warten, und setzt das interne Flag closing. Danach werden keine neuen Aufgaben wie Nachrichten oder Timer mehr verarbeitet, und der Worker wird beendet.
Ein Shared Worker kann von mehreren Browsing-Kontexten (Tabs, iframes, Fenstern) derselben Herkunft genutzt werden. Mit close() beendet sich der Worker also für alle verbundenen Clients auf einmal. Die Seite selbst hat keine terminate()-Methode wie beim dedizierten Worker. Sie kann nur ihren eigenen Port mit port.close() schließen. Den Worker als Ganzes kann nur der Worker selbst über close() beenden, oder der Browser räumt ihn auf, sobald kein Client mehr verbunden ist.
Typische Einsatzfälle: Ein Worker räumt sich kontrolliert auf, wenn der letzte Client sich abgemeldet hat. Er beendet sich nach einem fatalen Fehler. Oder er reagiert auf einen expliziten „Shutdown“-Befehl, zum Beispiel beim Abmelden des Nutzers.
Beispiele
Worker beendet sich auf Befehl eines Clients
// shared-worker.js
const ports = new Set();
self.addEventListener('connect', (event) => {
const port = event.ports[0];
ports.add(port);
port.addEventListener('message', ({ data }) => {
if (data.type === 'shutdown') {
// Alle Clients vorab informieren
for (const p of ports) p.postMessage({ type: 'closing' });
self.close(); // Worker für alle Clients beenden
}
});
port.start();
});
// main.js (Seite)
const worker = new SharedWorker('shared-worker.js');
worker.port.onmessage = ({ data }) => console.log('Worker:', data.type);
worker.port.postMessage({ type: 'shutdown' });
Aufräumen, wenn der letzte Client sich abmeldet
// shared-worker.js
let clients = 0;
onconnect = (event) => {
const port = event.ports[0];
clients++;
port.onmessage = ({ data }) => {
if (data === 'bye') {
clients--;
port.close();
if (clients === 0) {
console.log('Letzter Client weg – Worker schließt sich');
close();
}
}
};
};
// main.js
const { port } = new SharedWorker('shared-worker.js');
window.addEventListener('pagehide', () => port.postMessage('bye'));
Wartende Aufgaben werden nach close() verworfen
// shared-worker.js
onconnect = (event) => {
const port = event.ports[0];
setTimeout(() => port.postMessage('Timer ausgeführt'), 0);
port.postMessage('vor close()');
close();
// Synchroner Code läuft noch zu Ende:
console.log('nach close() – läuft noch synchron');
};
// main.js
const { port } = new SharedWorker('shared-worker.js');
port.onmessage = ({ data }) => console.log(data);
// Wichtig · Fallstricke
- Synchroner Code läuft weiter:
close()bricht das gerade laufende Skript nicht ab. Anweisungen danach werden noch ausgeführt, aber es startet keine neue Aufgabe mehr, also keine Timer, Nachrichten oder Promise-basierten Ereignisse. Rufeclose()daher am besten als letzte Anweisung auf oder direkt vor einemreturn. - Wirkt auf alle Clients: Ein Shared Worker wird von mehreren Tabs geteilt.
close()trennt alle verbundenen Ports gleichzeitig. Die Clients bekommen dabei kein automatisches Ereignis. Informiere sie deshalb vorher selbst perpostMessage. - Kein
terminate()von außen: Anders als beim dediziertenWorkerkann die Seite einenSharedWorkernicht direkt beenden. Sie kann nur ihren eigenenMessagePortmitport.close()schließen. - Neustart: Nach
close()erzeugt ein erneutesnew SharedWorker(url)eine frische Instanz. Der vorherige Zustand ist dann verloren. Wenn Daten erhalten bleiben sollen, speichere sie in IndexedDB. - Kompatibilität:
SharedWorkerwird von Chrome, Edge und Firefox am Desktop unterstützt, von Safari ab Version 16. Chrome für Android unterstützt ihn nicht. Prüfe die Verfügbarkeit mit'SharedWorker' in window.