Window: fetchLater()-Methode
Eingeschränkt verfügbar
Diese Funktion ist nicht Baseline, da sie in einigen der am weitesten verbreiteten Browser nicht funktioniert.
Want more browser support for this feature? Tell us why.
Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.
Die Methode fetchLater() der Schnittstelle Window erstellt eine verzögerte Fetch-Anfrage.
Eine fetchLater()-Anfrage wird gesendet, sobald die Seite verlassen wird (wenn sie zerstört wird oder in den bfcache gelangt) oder wenn ein angegebener activateAfter-Timeout abläuft – je nachdem, was zuerst eintritt.
Die Methode fetchLater() gibt ein FetchLaterResult-Objekt zurück. Dessen Eigenschaft activated gibt an, ob die Anfrage bereits gesendet wurde. Die Methode gibt nicht das Ergebnis der eigentlichen Fetch-Anfrage zurück, wenn diese gesendet wird (da dies häufig erst geschieht, nachdem das Dokument zerstört wurde). Die gesamte Antwort auf die Fetch-Anfrage, einschließlich Body und Headern, wird ignoriert.
Anfragen, deren Body ein ReadableStream ist, können nicht verzögert werden.
Die Methode fetchLater() wird durch die connect-src-Direktive der Content Security Policy gesteuert, nicht durch die Direktive für die abgerufenen Ressourcen.
Syntax
fetchLater(resource)
fetchLater(resource, options)
Parameter
Die Methode fetchLater() akzeptiert dieselben Parameter wie fetch(), jedoch mit der zusätzlichen Option activateAfter.
resource-
Gibt die Ressource an, die Sie abrufen möchten. Wie bei
fetch()kann dies Folgendes sein:- Ein String oder ein anderes Objekt mit einem stringifier – einschließlich eines
URL-Objekts –, das die URL der abzurufenden Ressource bereitstellt. Die URL kann relativ zur Basis-URL sein. Im Fensterkontext ist dies diebaseURIdes Dokuments. - Ein
Request-Objekt.
- Ein String oder ein anderes Objekt mit einem stringifier – einschließlich eines
optionsOptional-
Ein
DeferredRequestInit-Objekt mit benutzerdefinierten Einstellungen für die Anfrage. Dazu gehört einactivateAfter-Timeout, das festlegt, wie lange das Senden der Anfrage verzögert werden soll.
Ausnahmen
Für fetchLater() können dieselben Ausnahmen wie für fetch() sowie die folgenden zusätzlichen Ausnahmen ausgelöst werden:
QuotaExceededError-
Die Verwendung dieser Funktion wurde blockiert, weil das verfügbare Kontingent überschritten wurde. Weitere Informationen finden Sie unter Kontingente für
fetchLater(). Aufrufender Code sollte aufQuotaExceededErrorvorbereitet sein und diesen Fehler in fast allen Fällen abfangen, insbesondere wenn JavaScript von Drittanbietern eingebunden wird. RangeError-
Wird ausgelöst, wenn für
activateAfterein negativer Wert angegeben wird. TypeError-
Zusätzlich zu den Gründen, die für
fetch()gelten, wird diese Ausnahme auch bei einer Anfrage mit einemReadableStream(die nicht verzögert werden kann) oder bei der Verwendung nicht vertrauenswürdiger URLs (z. B.http://) ausgelöst.
Rückgabewert
Ein FetchLaterResult mit der booleschen Eigenschaft activated, die angibt, ob die Anfrage bereits gesendet wurde.
Hinweis: Sobald die Fetch-Anfrage gesendet wurde, ist ihre Antwort – einschließlich Body und Headern – nicht verfügbar und wird ignoriert.
Beispiele
Der Artikel zu den Kontingenten für fetchLater() enthält Beispiele dafür, wie die Kontingente angewendet werden.
Eine GET-Anfrage verzögern, bis die Seite verlassen oder geschlossen wird
fetchLater("/send_beacon");
Eine POST-Anfrage um etwa eine Minute verzögern
In diesem Beispiel erstellen wir einen Request und geben für activateAfter einen Wert an, um das Senden der Anfrage um 60.000 Millisekunden (oder eine Minute) zu verzögern:
fetchLater("/send_beacon", {
method: "POST",
body: getBeaconData(),
activateAfter: 60000, // 1 minute
});
Hinweis: Der tatsächliche Sendezeitpunkt ist nicht bekannt, da der Browser länger oder kürzer warten kann, beispielsweise um die gebündelte Verarbeitung verzögerter Fetch-Anfragen zu optimieren.
Eine POST-Anfrage mit try/catch um etwa eine Minute verzögern
Dies ist dasselbe Beispiel wie oben. Es empfiehlt sich jedoch, den Code in einen try/catch-Block einzuschließen:
try {
fetchLater("/send_beacon", {
method: "POST",
body: getBeaconData(),
activateAfter: 60000, // 1 minute
});
} catch (e) {
if (e instanceof QuotaExceededError) {
// Handle the quota error
} else {
// Handle other errors
}
}
Eine POST-Anfrage um etwa eine Minute verzögern und eine Funktion zur Prüfung des Sendestatus erstellen
const result = fetchLater("https://report.example.com", {
method: "POST",
body: JSON.stringify(myReport),
activateAfter: 60000 /* 1 minute */,
});
function checkIfFetched() {
return result.activated;
}
Eine ausstehende Anfrage aktualisieren
In diesem Beispiel verwenden wir einen AbortController, um die Anfrage abzubrechen und neu zu erstellen:
let beaconResult = null;
let beaconAbort = null;
function updateBeacon(data) {
const pending = !beaconResult || !beaconResult.activated;
if (pending && beaconAbort) {
beaconAbort.abort();
}
createBeacon(data);
}
function createBeacon(data) {
if (beaconResult && !beaconResult.activated) {
// Avoid creating duplicated beacon if the previous one is still pending.
return;
}
beaconAbort = new AbortController();
beaconResult = fetchLater({
url: data,
signal: beaconAbort.signal,
});
}
Ungültige Beispiele
Jeder der folgenden Aufrufe von fetchLater() würde eine Ausnahme auslösen:
// Only potentially trustworthy URLs are supported
fetchLater("http://untrusted.example.com");
// The length of the deferred request has to be known
fetchLater("https://origin.example.com", { body: someDynamicStream });
// Deferred fetching only works on active windows
const detachedWindow = iframe.contentWindow;
iframe.remove();
detachedWindow.fetchLater("https://origin.example.com");
Spezifikationen
| Spezifikation |
|---|
| Fetch> # deferred-fetch> |