JavaScript/Objekte/ExtendableEvent

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Die Schnittstelle ExtendableEvent ist eine Erweiterung der normalen Event-Schnittstelle des DOM. Sie wird im Serviceworker-API genutzt, um Events steuern zu können, bei deren Behandlung mit Promises gearbeitet werden muss.

Einführung

Ein normales Event ist nur solange aktiv, bis alle dafür registrierten Eventhandler-Funktionen durchgeführt wurden (inclusive Bubbling). Ruft eine Eventhandler-Funktion aber eine Schnittstelle auf, die asnychron arbeitet, so sollte das Event aktiv bleiben, bis auch die Antwort auf den asynchronen Aufruf verarbeitet wurde. Andernfalls könnte ein bereits mit der Bearbeitung einer Folgeaktion begonnen werden, bevor die Voraussetzungen dafür erfüllt sind.

Ein Beispiel dafür wäre das install-Event eines Serviceworkers. In diesem Event sollen die für einen Offline-Betrieb eines Workers erforderlichen Dateien geladen werden. Nachdem das install-Event behandelt wurde, kann der Serviceworker aktiviert werden. Und dann beendet der Anwender möglicherweise den Browser. Ohne ExtendableEvents könnte es nun sein, dass der Download der Offline-Dateien noch gar nicht fertig ist, während der Serviceworker bereits aktiviert und der Browser geschlossen wird, mit der Folge, dass die vom Serviceworker gesteuerte Webseite beim nächsten Start des Browsers - der womöglich auch noch im Offline-Betrieb erfolgt - nicht geladen werden kann, weil Dateien fehlen.

Die Aktivitätsdauer eines ExtendableEvents wird über Promises gesteuert. Jedes Eventobjekt, das diese Schnittstelle nutzt, besitzt

  • Eine Liste von extend lifetime promises (oder Lifetime-Promises)
  • Einen pending promises Zähler, der angibt, wieviele dieser Lifetime-Promises noch im Zustand pending sind
  • Ein timed out Flag. Es wird vom Browser gesetzt, wenn nach einer vom Browserhersteller festgelgten Zeit der pending promises Zähler nicht 0 geworden ist

Ein ExtendableEvent gilt als aktiv, wenn

  • die Verarbeitung der Eventhandler-Funktionen noch läuft (d.h. wenn die normale Event-Verarbeitung des DOM noch läuft)
  • der pending promises-Zähler größer als 0 ist und das timed out-Flag nicht gesetzt wurde.

Solange es für einen Serviceworker noch aktive ExtendableEvents gibt, soll er vom Browser nicht beendet werden. Die Abläufe beim Installieren und Aktivieren eines neuen Serviceworkers warten jeweils, bis die Eventobjekte, die für die install- und activate-Events erzeugt wurden, nicht mehr aktiv sind, bevor sie weiterarbeiten.

Eigenschaften und Methoden

Ein ExtendableEvent verfügt über alle Eigenschaften und Methoden eines normalen Events. Die oben genannte Promise-Liste, der Pending-Zähler und das Timeout-Flag sind intern und können aus JavaScript nicht angesprochen werden. Es gibt lediglich eine zusätzliche Methode:

waitUntil()

Syntax
extEvent.waitUntil(promise);
Parameter
promise
Ein Promise, das der Liste der Lifetime-Promises hinzugefügt werden soll.
Rückgabewert
keiner

Der Wert, mit dem das übergebene Promise erfüllt wird, ist irrelevant. Für manche Events ist es aber relevant, ob die Lifetime-Promises erfüllt oder abgewiesen werden; eine solche Angaben finden Sie bei dem jeweiligen Event.