Signatur
Beschreibung
Der Konstruktor BackgroundFetchUpdateUIEvent() erzeugt ein Ereignisobjekt vom Typ BackgroundFetchUpdateUIEvent. Dieses Interface erweitert BackgroundFetchEvent (und damit ExtendableEvent). Der Browser verschickt es im Service Worker als backgroundfetchsuccess oder backgroundfetchfail, sobald ein mit der Background Fetch API gestarteter Download abgeschlossen oder fehlgeschlagen ist.
In der Praxis rufst du den Konstruktor fast nie selbst auf. Du bekommst das Objekt als Argument deines Event-Handlers und nutzt dann event.registration, um auf die Antworten zuzugreifen, und event.updateUI(), um Titel und Symbole der Fortschrittsanzeige des Browsers zu ändern, z. B. von „Wird heruntergeladen…“ auf „Folge 12 bereit“.
Einen eigenen Aufruf des Konstruktors brauchst du vor allem in Tests, etwa um Handler-Logik mit einem nachgebauten Ereignis zu prüfen. Dafür musst du ein echtes BackgroundFetchRegistration-Objekt übergeben. Der Konstruktor steht nur im Service-Worker-Kontext (ServiceWorkerGlobalScope) zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignisses, groß-/kleinschreibungssensitiv. Der Browser verwendet "backgroundfetchsuccess" oder "backgroundfetchfail". |
|
| $options Pflicht | object | Initialisierungsobjekt. Es enthält alle Felder von ExtendableEventInit (bubbles, cancelable, composed) und zusätzlich:
|
Rückgabewert
BackgroundFetchUpdateUIEvent-Objekt. Seine Eigenschaft registration verweist auf die übergebene Registrierung.Beispiele
Typische Nutzung: UI nach erfolgreichem Download aktualisieren
// sw.js – der Browser erzeugt das Event selbst
self.addEventListener('backgroundfetchsuccess', (event) => {
const bgFetch = event.registration;
event.waitUntil((async () => {
// Alle Antworten im Cache speichern
const cache = await caches.open('podcasts');
const records = await bgFetch.matchAll();
await Promise.all(records.map(async (record) => {
const response = await record.responseReady;
await cache.put(record.request, response);
}));
// Download-Oberfläche des Browsers anpassen
await event.updateUI({ title: `Folge „${bgFetch.id}“ ist bereit` });
})());
});
Fehlschlag melden mit backgroundfetchfail
// sw.js
self.addEventListener('backgroundfetchfail', (event) => {
const { id, failureReason } = event.registration;
console.warn(`Background Fetch ${id} fehlgeschlagen:`, failureReason);
event.waitUntil(
event.updateUI({
title: 'Download fehlgeschlagen, bitte erneut versuchen',
icons: [{ src: '/icons/error-192.png', sizes: '192x192', type: 'image/png' }]
})
);
});
Konstruktor manuell aufrufen (z. B. für Tests im Service Worker)
// sw.js – setzt eine bestehende Registrierung mit der ID 'folge-12' voraus
const testeHandler = async () => {
const registration = await self.registration.backgroundFetch.get('folge-12');
if (!registration) return;
const event = new BackgroundFetchUpdateUIEvent('backgroundfetchsuccess', {
registration
});
console.log(event.type, event.registration.id, event.isTrusted);
try {
await event.updateUI({ title: 'Test' });
} catch (err) {
// Synthetische Events dürfen die UI nicht ändern
console.log(err.name);
}
};
testeHandler();
// Wichtig · Fallstricke
- Experimentell und eingeschränkt verfügbar: Die Background Fetch API gibt es nur in Chromium-Browsern (Chrome, Edge, Opera). Firefox und Safari unterstützen sie nicht. Prüfe vorher mit
'BackgroundFetchManager' in selfbzw.'backgroundFetch' in registration. - Den Konstruktor gibt es nur im Service Worker. Im Fenster-Kontext führt
new BackgroundFetchUpdateUIEvent()zu einemReferenceError. options.registrationist Pflicht. Fehlt es, wirft der Konstruktor einenTypeError. Ein einfaches Objekt reicht nicht, es muss ein echtesBackgroundFetchRegistrationsein.- Bei selbst erzeugten Ereignissen ist
isTrustedfalse.updateUI()gibt dann ein abgelehntes Promise mitInvalidStateErrorzurück. Dasselbe passiert, wenn duupdateUI()ein zweites Mal aufrufst oder erst, nachdem das Ereignis nicht mehr aktiv ist. Rufe es deshalb innerhalb vonevent.waitUntil()auf. - Nur die Ereignisse
backgroundfetchsuccessundbackgroundfetchfailverwenden dieses Interface.backgroundfetchabortundbackgroundfetchclickliefern ein normalesBackgroundFetchEventohneupdateUI(). - Große Icons, die du über
updateUI()übergibst, lädt der Browser zusätzlich herunter. Nimm deshalb kleine, gecachte Bilder.