Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

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

js
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 die baseURI des Dokuments.
  • Ein Request-Objekt.
options Optional

Ein DeferredRequestInit-Objekt mit benutzerdefinierten Einstellungen für die Anfrage. Dazu gehört ein activateAfter-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 auf QuotaExceededError vorbereitet sein und diesen Fehler in fast allen Fällen abfangen, insbesondere wenn JavaScript von Drittanbietern eingebunden wird.

RangeError

Wird ausgelöst, wenn für activateAfter ein negativer Wert angegeben wird.

TypeError

Zusätzlich zu den Gründen, die für fetch() gelten, wird diese Ausnahme auch bei einer Anfrage mit einem ReadableStream (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

js
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:

js
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:

js
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

js
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:

js
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:

js
// 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

Browser-Kompatibilität

Siehe auch