Start · Sprachen · JavaScript · Referenz · SharedWorkerGlobalScope.close()

SharedWorkerGlobalScope.close()

Methode

Beendet einen SharedWorker von innen heraus: Alle Aufgaben in seiner Ereignisschleife werden verworfen und der globale Bereich wird geschlossen.

seit JavaScript Baseline: Chrome, Firefox, Safari 16+ (nicht Chrom Kategorie: webapi

Signatur

SharedWorkerGlobalScope.close()

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' });
Worker: closing

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'));
Letzter Client weg – Worker schließt sich

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);
nach close() – läuft noch synchron (in der Worker-Konsole) vor close() (auf der Seite; die Timer-Nachricht kommt nie an)

// 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. Rufe close() daher am besten als letzte Anweisung auf oder direkt vor einem return.
  • 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 per postMessage.
  • Kein terminate() von außen: Anders als beim dedizierten Worker kann die Seite einen SharedWorker nicht direkt beenden. Sie kann nur ihren eigenen MessagePort mit port.close() schließen.
  • Neustart: Nach close() erzeugt ein erneutes new SharedWorker(url) eine frische Instanz. Der vorherige Zustand ist dann verloren. Wenn Daten erhalten bleiben sollen, speichere sie in IndexedDB.
  • Kompatibilität: SharedWorker wird 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.