Start · Sprachen · JavaScript · Referenz · SyncEvent.tag

SyncEvent.tag

Eigenschaft

Schreibgeschützte Zeichenkette mit dem Bezeichner, den der Entwickler beim Registrieren über <code>SyncManager.register()</code> für dieses <code>SyncEvent</code> vergeben hat.

seit JavaScript Background Sync API — Chromium-Browser (Chrome 49+ Kategorie: webapi

Signatur

SyncEvent.tag

Beschreibung

Die Eigenschaft tag eines SyncEvent gibt den Namen zurück, unter dem eine Hintergrund-Synchronisation registriert wurde. Die Registrierung erfolgt im Seitenkontext oder im Service Worker mit registration.sync.register('mein-tag'). Sobald der Browser wieder eine Netzwerkverbindung erkennt, löst er im Service Worker das Ereignis sync aus. Über event.tag erkennt man dort, welche Aufgabe gerade ausgeführt werden soll.

Braucht eine Anwendung mehrere Arten von Hintergrundaufgaben, etwa „ausstehende Nachrichten senden“ und „Formulardaten hochladen“, dann bekommt jede Aufgabe ein eigenes Tag. Der sync-Handler verzweigt anhand von event.tag in die passende Logik. Wird dasselbe Tag mehrmals registriert, solange noch eine Synchronisation aussteht, fasst der Browser diese Registrierungen zu einer einzigen zusammen. Tags eignen sich deshalb gut, um doppelte Aufträge zu vermeiden.

Die Eigenschaft ist schreibgeschützt. Ihr Wert ist genau die Zeichenkette, die an register() übergeben wurde. Sie wird in der Regel zusammen mit event.waitUntil() genutzt, damit der Service Worker aktiv bleibt, bis die Arbeit erledigt ist.

Rückgabewert

Typ
string
Beschreibung
Der beim Aufruf von SyncManager.register(tag) vergebene Bezeichner der Synchronisations-Aufgabe.

Beispiele

Sync registrieren und im Service Worker nach Tag verzweigen

// main.js – Seitenkontext
const registriereSync = async () => {
  const reg = await navigator.serviceWorker.ready;
  if ('sync' in reg) {
    await reg.sync.register('nachrichten-senden');
    console.log('Sync registriert');
  }
};
registriereSync();

// sw.js – Service Worker
self.addEventListener('sync', (event) => {
  console.log('Sync-Tag:', event.tag);
  if (event.tag === 'nachrichten-senden') {
    event.waitUntil(sendeAusstehendeNachrichten());
  }
});

const sendeAusstehendeNachrichten = async () => {
  // z. B. Daten aus IndexedDB lesen und per fetch senden
  await fetch('/api/nachrichten', { method: 'POST', body: '[]' });
};
Sync registriert Sync-Tag: nachrichten-senden

Mehrere Aufgaben über eine Zuordnungstabelle abarbeiten

// sw.js
const aufgaben = {
  'formular-upload': () => fetch('/api/formular', { method: 'POST' }),
  'statistik-senden': () => fetch('/api/statistik', { method: 'POST' }),
};

self.addEventListener('sync', (event) => {
  const aufgabe = aufgaben[event.tag];
  if (!aufgabe) {
    console.warn(`Unbekanntes Sync-Tag: ${event.tag}`);
    return;
  }
  event.waitUntil(aufgabe());
});

Tags mit ID für einzelne Datensätze und letzter Versuch

// Seitenkontext: eindeutiges Tag pro Entwurf
const reg = await navigator.serviceWorker.ready;
await reg.sync.register(`entwurf-${42}`);

// sw.js
self.addEventListener('sync', (event) => {
  if (event.tag.startsWith('entwurf-')) {
    const id = event.tag.slice('entwurf-'.length);
    console.log(`Entwurf ${id}, letzter Versuch: ${event.lastChance}`);
    event.waitUntil(fetch(`/api/entwuerfe/${id}`, { method: 'PUT' }));
  }
});
Entwurf 42, letzter Versuch: false

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Die Background Sync API gibt es nur in Chromium-basierten Browsern. Firefox und Safari unterstützen sie nicht. Prüfe deshalb vorher mit 'sync' in registration und sieh eine Ausweichlösung vor, etwa ein Senden beim nächsten Seitenaufruf oder beim Ereignis online.
  • SyncEvent steht nur im Service-Worker-Kontext zur Verfügung. Außerdem ist ein sicherer Kontext (HTTPS) nötig.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung an event.tag wird ohne Fehlermeldung ignoriert; im Strict Mode löst sie einen TypeError aus.
  • Mehrere Registrierungen mit demselben Tag werden zu einer zusammengefasst. Wer pro Datensatz eine eigene Synchronisation braucht, sollte eindeutige Tags verwenden, z. B. mit angehängter ID.
  • Ohne event.waitUntil() kann der Browser den Service Worker vorzeitig beenden. Wird das übergebene Promise abgelehnt, versucht der Browser die Synchronisation später erneut, aber nur begrenzt oft. Ob es der letzte Versuch ist, zeigt event.lastChance.
  • Speichere keine vertraulichen Daten im Tag. Lege stattdessen nur einen Schlüssel ab und halte die eigentlichen Daten in IndexedDB.