Signatur
Beschreibung
Mit get() holen Sie eine laufende Hintergrund-Übertragung (Background Fetch) wieder ab, die zuvor mit BackgroundFetchManager.fetch() unter einer bestimmten id gestartet wurde. Erreichbar ist die Methode über registration.backgroundFetch eines ServiceWorkerRegistration-Objekts, und zwar sowohl im Fensterkontext als auch im Service Worker selbst.
Typische Anwendungsfälle sind:
- Nach einem Neuladen der Seite den Fortschritt eines großen Downloads (z. B. Podcast-Folge, Film, Offline-Paket) wieder in der Oberfläche anzeigen.
- Vor dem Start prüfen, ob ein Download mit derselben
idschon läuft, damitfetch()nicht mit einemTypeErrorabbricht. - Eine laufende Übertragung gezielt über
registration.abort()abbrechen.
Das Promise wird nur mit aktiven Registrierungen aufgelöst. Ist der Fetch schon abgeschlossen und das zugehörige Ereignis (backgroundfetchsuccess, backgroundfetchfail, backgroundfetchabort) im Service Worker vollständig verarbeitet, liefert get() undefined.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $id Pflicht | string | Die Kennung der Hintergrund-Übertragung, die beim Aufruf von BackgroundFetchManager.fetch(id, requests, options) vergeben wurde. |
Rückgabewert
BackgroundFetchRegistration aufgelöst wird oder mit undefined, wenn keine aktive Registrierung mit dieser id existiert.Beispiele
Laufenden Download abfragen und Fortschritt anzeigen
const zeigeFortschritt = async (id) => {
const reg = await navigator.serviceWorker.ready;
const bgFetch = await reg.backgroundFetch.get(id);
if (!bgFetch) {
console.log(`Kein aktiver Download mit der ID "${id}".`);
return;
}
const aktualisieren = () => {
const prozent = bgFetch.downloadTotal
? Math.round((bgFetch.downloaded / bgFetch.downloadTotal) * 100)
: 0;
console.log(`${id}: ${prozent} %`);
};
aktualisieren();
bgFetch.addEventListener('progress', aktualisieren);
};
zeigeFortschritt('podcast-folge-42');
Doppelten Start verhindern
const starteDownload = async (id, urls) => {
const reg = await navigator.serviceWorker.ready;
if (!('backgroundFetch' in reg)) {
throw new Error('Background Fetch wird nicht unterstützt.');
}
// Existiert schon eine aktive Registrierung, diese wiederverwenden
const vorhanden = await reg.backgroundFetch.get(id);
if (vorhanden) return vorhanden;
return reg.backgroundFetch.fetch(id, urls, {
title: 'Offline-Paket',
downloadTotal: 50 * 1024 * 1024
});
};
starteDownload('offline-paket', ['/pakete/karten.zip'])
.then((bg) => console.log('Aktiv:', bg.id));
Download gezielt abbrechen
const brecheAb = async (id) => {
const reg = await navigator.serviceWorker.ready;
const bgFetch = await reg.backgroundFetch.get(id);
if (!bgFetch) return false;
return bgFetch.abort();
};
document.querySelector('#abbrechen')
.addEventListener('click', async () => {
const ok = await brecheAb('film-4k');
console.log(ok ? 'Abgebrochen' : 'Nichts zum Abbrechen');
});
// Wichtig · Fallstricke
- Kompatibilität: Experimentelle API, derzeit nur in Chromium-Browsern (Chrome, Edge, Opera) verfügbar. Firefox und Safari unterstützen sie nicht. Prüfen Sie die Verfügbarkeit daher immer mit
'backgroundFetch' in registration. - Die API steht nur in sicheren Kontexten (HTTPS oder
localhost) und mit einem aktiven Service Worker zur Verfügung.navigator.serviceWorker.readywird erst aufgelöst, wenn ein Service Worker aktiv ist. - Die Rückgabe
undefinedbedeutet nicht unbedingt, dass es nie einen Download gab. Er kann auch schon abgeschlossen oder abgebrochen und fertig verarbeitet sein. Den Endzustand sollten Sie deshalb im Service Worker über diebackgroundfetch*-Ereignisse speichern, etwa in IndexedDB oder in der Cache API. - Jeder Aufruf von
get()kann ein neuesBackgroundFetchRegistration-Objekt liefern. Vergleichen Sie Registrierungen daher überidund nicht mit===. - Die Registrierungen gelten nur für die jeweilige Service-Worker-Registrierung (Scope). Ein anderer Scope sieht dieselbe
idnicht.