Signatur
Beschreibung
Der Konstruktor BackgroundFetchEvent() erzeugt ein Event-Objekt der Background Fetch API. Solche Events bekommt ein Service Worker, sobald ein Hintergrund-Download einen neuen Zustand erreicht, zum Beispiel backgroundfetchabort oder backgroundfetchclick. Über die Eigenschaft registration hat das Event Zugriff auf die zugehörige BackgroundFetchRegistration.
Normalerweise erzeugt der Browser diese Events selbst. Den Konstruktor ruft man nur selten direkt auf. Sinnvoll ist das vor allem in Tests, wenn man Event-Handler eines Service Workers mit einem nachgebauten Event auslösen will, oder beim Schreiben von Polyfills und Mocks.
BackgroundFetchEvent erbt von ExtendableEvent. Deshalb steht auch waitUntil() zur Verfügung, mit dem der Service Worker so lange aktiv bleibt, bis eine asynchrone Aufgabe erledigt ist. Für die Events backgroundfetchsuccess und backgroundfetchfail gibt es die Unterklasse BackgroundFetchUpdateUIEvent, die zusätzlich updateUI() anbietet.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Events, z. B. "backgroundfetchabort" oder "backgroundfetchclick". Groß- und Kleinschreibung zählt. |
|
| $options Pflicht | Object | Einstellungsobjekt. Es enthält alle Optionen von ExtendableEventInit (bubbles, cancelable, composed) und zusätzlich registration. |
|
| $options.registration Pflicht | BackgroundFetchRegistration | Die BackgroundFetchRegistration, zu der das Event gehört. Fehlt sie, wirft der Konstruktor einen TypeError. |
Rückgabewert
BackgroundFetchEvent-Objekt. Seine Eigenschaft registration verweist auf die übergebene Registrierung.Beispiele
Browser-Events im Service Worker verarbeiten (üblicher Fall)
// sw.js – der Browser erzeugt die BackgroundFetchEvent-Objekte selbst
self.addEventListener('backgroundfetchabort', (event) => {
const { id } = event.registration;
console.log(`Download ${id} wurde abgebrochen`);
// Service Worker aktiv halten, bis aufgeräumt ist
event.waitUntil(caches.delete(`bgfetch-${id}`));
});
self.addEventListener('backgroundfetchclick', (event) => {
// Nutzer hat auf die Download-Anzeige des Browsers geklickt
event.waitUntil(clients.openWindow(`/downloads/${event.registration.id}`));
});
Event von Hand erzeugen und auslösen (z. B. im Test)
// sw.js – eine laufende Registrierung holen und ein nachgebautes Event auslösen
const simulateAbort = async (id) => {
const registration = await self.registration.backgroundFetch.get(id);
if (!registration) {
console.warn(`Keine Registrierung mit der ID ${id}`);
return;
}
const event = new BackgroundFetchEvent('backgroundfetchabort', {
registration
});
console.log(event.type, event.registration.id);
self.dispatchEvent(event);
};
simulateAbort('podcast-42');
Fehlende Unterstützung und fehlende Pflicht-Option abfangen
// Vorher prüfen, ob die API überhaupt vorhanden ist
if (typeof BackgroundFetchEvent === 'undefined') {
console.log('Background Fetch wird hier nicht unterstützt');
} else {
try {
// Ohne registration wirft der Konstruktor einen Fehler
new BackgroundFetchEvent('backgroundfetchclick', {});
} catch (err) {
console.log(err.name);
}
}
// Wichtig · Fallstricke
- Experimentell: Die Background Fetch API gibt es nur in Chromium-Browsern (Chrome, Edge, Opera). Firefox und Safari unterstützen sie nicht. Vor der Nutzung sollte man prüfen, ob sie vorhanden ist, z. B. mit
'BackgroundFetchManager' in self. - Nur im Service Worker: Der Konstruktor steht ausschließlich im
ServiceWorkerGlobalScopebereit. Im Hauptthread (window) istBackgroundFetchEventnicht definiert. - Sicherer Kontext: Die API funktioniert nur über HTTPS oder auf
localhost. - Pflicht-Option
registration: Ohne diese Option wirft der Konstruktor einenTypeError. Ein eigenesBackgroundFetchRegistration-Objekt kann man nicht erzeugen. Man bekommt es nur überbackgroundFetch.fetch()oderbackgroundFetch.get(). waitUntil()bei selbst erzeugten Events: Ruft manwaitUntil()bei einem von Hand ausgelösten Event auf, verlängert das die Lebensdauer des Service Workers nicht. In der Regel wird dabei sogar einInvalidStateErrorgeworfen, weil das Event nicht vom Browser stammt.- Für
backgroundfetchsuccessundbackgroundfetchfailsollte manBackgroundFetchUpdateUIEventnutzen, weil nur diese KlasseupdateUI()hat.