Signatur
Beschreibung
Die Eigenschaft lastChance gehört zum Interface SyncEvent der Background Synchronization API. Ein Service Worker bekommt ein sync-Event, sobald der Browser eine registrierte Synchronisation ausführen will, meist nachdem die Netzwerkverbindung wieder da ist. Schlägt das Promise fehl, das an event.waitUntil() übergeben wurde, versucht der Browser es später erneut. Wie oft und in welchen Abständen, entscheidet er selbst.
lastChance ist true, wenn der aktuelle Versuch der letzte ist. Scheitert er, verwirft der Browser das Sync-Tag endgültig. Beim letzten Versuch kann man daher eine Ausweichlösung starten, zum Beispiel:
- den Nutzer per Benachrichtigung darauf hinweisen, dass die Daten nicht übertragen wurden,
- die ausstehenden Daten dauerhaft in IndexedDB als „fehlgeschlagen“ markieren, damit die Anwendung sie später selbst noch einmal senden kann,
- Fehler protokollieren oder Telemetrie senden.
Die Eigenschaft kann man nur lesen. Sie ist nur im Service-Worker-Kontext innerhalb eines sync-Handlers sinnvoll. Zusammen mit SyncEvent.tag kann man die Fehlerbehandlung für jede Art von Synchronisation getrennt steuern.
Rückgabewert
true, wenn nach einem Fehlschlag dieses Versuchs keine weiteren Versuche folgen, sonst false.Beispiele
Letzten Versuch im Service Worker erkennen
// sw.js
self.addEventListener('sync', (event) => {
if (event.tag !== 'outbox') return;
console.log(`Sync-Versuch für "${event.tag}", letzter Versuch: ${event.lastChance}`);
event.waitUntil(sendOutbox());
});
const sendOutbox = async () => {
const res = await fetch('/api/outbox', { method: 'POST' });
if (!res.ok) throw new Error(`HTTP ${res.status}`); // löst einen neuen Versuch aus
};
Nutzer benachrichtigen, wenn auch der letzte Versuch scheitert
// sw.js
self.addEventListener('sync', (event) => {
if (event.tag !== 'send-message') return;
event.waitUntil((async () => {
try {
const res = await fetch('/api/messages/flush', { method: 'POST' });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
} catch (err) {
if (event.lastChance) {
// Es folgt kein weiterer Versuch mehr – Nutzer informieren
await self.registration.showNotification('Nachricht nicht gesendet', {
body: 'Bitte öffne die App und sende die Nachricht erneut.',
tag: 'sync-failed'
});
return; // Promise wird erfüllt, der Sync gilt damit als beendet
}
throw err; // Browser plant einen neuen Versuch
}
})());
});
Synchronisation auf der Seite registrieren
// main.js (Seitenkontext)
const registerSync = async () => {
const reg = await navigator.serviceWorker.ready;
if ('sync' in reg) {
await reg.sync.register('send-message');
console.log('Hintergrund-Synchronisation registriert');
} else {
console.log('Background Sync nicht unterstützt – sofort senden');
}
};
registerSync();
// Wichtig · Fallstricke
- Browser-Kompatibilität: Die Background Synchronization API gibt es nur in Chromium-Browsern (Chrome, Edge, Opera, Samsung Internet). Firefox und Safari unterstützen sie nicht. Prüfe deshalb vorher mit
'sync' in registration, ob sie verfügbar ist, und sieh eine Ausweichlösung vor. - Die Anzahl der Versuche und die Abstände dazwischen sind nicht festgelegt. In Chrome sind es derzeit in der Regel drei Versuche, der Abstand wird mit jedem Versuch größer. Verlass dich nicht auf feste Werte.
- Gibst du beim letzten Versuch ein erfülltes Promise an
waitUntil(), gilt der Sync als erfolgreich. Das ist nützlich, damit keine Fehlermeldung ins Leere läuft. Die Daten musst du dann aber selbst aufbewahren, zum Beispiel in IndexedDB. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ignoriert (im Strict Mode gibt es einen
TypeError). - Nur in sicheren Kontexten (HTTPS) und innerhalb eines Service Workers verfügbar.