[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/de/docs/Web/API/Web_Locks_API [Back]  [Original]

Web Locks API - Web-APIs | MDN

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

View in English Always switch to English

Web Locks API

Baseline Weitgehend verfgbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit Mrz 2022 browserbergreifend verfgbar.

Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen untersttzenden Browsern verfgbar.

Hinweis: Diese Funktion ist in Web Workers verfgbar.

Die Web Locks API ermglicht Skripten, die in einem Tab oder Worker ausgefhrt werden, asynchron eine Sperre zu erwerben, sie zu halten, whrend Arbeiten ausgefhrt werden, und sie dann freizugeben. Solange die Sperre gehalten wird, kann kein anderes Skript im selben Ursprung die gleiche Sperre erwerben, was es einer Webanwendung ermglicht, die in mehreren Tabs oder Workern ausgefhrt wird, die Arbeit und die Nutzung von Ressourcen zu koordinieren.

In diesem Artikel

Konzepte und Nutzung

Eine Sperre ist ein abstraktes Konzept, das eine potenziell geteilte Ressource darstellt, die durch einen vom Webanwendung gewhlten Namen identifiziert wird. Zum Beispiel, wenn eine Webanwendung, die in mehreren Tabs luft, sicherstellen mchte, dass nur ein Tab Daten zwischen dem Netzwerk und Indexed DB synchronisiert, knnte jeder Tab versuchen, eine "my_net_db_sync"-Sperre zu erwerben, aber nur ein Tab wird erfolgreich sein (das Leader-Wahl-Muster.)

Die API wird wie folgt verwendet:

  1. Die Sperre wird angefordert.
  2. Arbeit wird in einem asynchronen Task ausgefhrt, whrend die Sperre gehalten wird.
  3. Die Sperre wird automatisch freigegeben, wenn der Task abgeschlossen ist.
js
navigator.locks.request("my_resource", async (lock) => {
  // The lock has been acquired.
  await do_something();
  await do_something_else();
  // Now the lock will be released.
});

Whrend eine Sperre gehalten wird, werden Anfragen fr dieselbe Sperre von diesem Ausfhrungskontext oder von anderen Tabs/Workern in die Warteschlange gestellt. Die erste Anfrage in der Warteschlange wird nur gewhrt, wenn die Sperre freigegeben wird.

Die API bietet optionale Funktionalitt, die bei Bedarf verwendet werden kann, einschlielich:

  • Rckgabe von Werten aus dem asynchronen Task
  • geteilte und exklusive Sperrmodi
  • bedingte Erfassung
  • Diagnosen, um den Zustand der Sperren in einem Ursprung abzufragen
  • eine Notlsung, um Deadlocks zu vermeiden

Sperren sind auf Ursprnge beschrnkt; die von einem Tab unter https://example.com erworbenen Sperren haben keinen Einfluss auf die von einem Tab unter https://example.org:8080 erworbenen Sperren, da sie unterschiedliche Ursprnge sind.

Der Haupteinstiegspunkt ist navigator.locks.request(), der eine Sperre anfordert. Es nimmt einen Sperrnamen, eine optionale Menge von Optionen und einen Rckruf an. Der Rckruf wird aufgerufen, wenn die Sperre gewhrt wird. Die Sperre wird automatisch freigegeben, wenn der Rckruf zurckkehrt, daher ist der Rckruf normalerweise eine async function, die bewirkt, dass die Sperre erst freigegeben wird, wenn die asynchrone Funktion vollstndig beendet ist.

Die request()-Methode selbst gibt ein Promise zurck, welches sich auflst, sobald die Sperre freigegeben wurde; innerhalb einer async Funktion kann ein Skript das Aufrufen mit await warten lassen, um den asynchronen Code linear auszufhren. Zum Beispiel:

js
await do_something_without_lock();

// Request the lock.
await navigator.locks.request("my_resource", async (lock) => {
  // The lock has been acquired.
  await do_something_with_lock();
  await do_something_else_with_lock();
  // Now the lock will be released.
});
// The lock has been released.

await do_something_else_without_lock();

Optionen

Mehrere Optionen knnen beim Anfordern einer Sperre bergeben werden:

  • mode: Der Standardmodus ist "exklusive", aber "shared" kann angegeben werden. Es kann nur einen "exklusive" Halter einer Sperre geben, aber mehrere "shared" Anfragen knnen gleichzeitig gewhrt werden. Dies kann verwendet werden, um das Readers-Writer-Muster zu implementieren.
  • ifAvailable: Wenn angegeben, wird das Sperranforderung fehlschlagen, wenn die Sperre nicht sofort ohne Warten gewhrt werden kann. Der Rckruf wird mit null aufgerufen.
  • steal: Wenn angegeben, werden alle gehaltenen Sperren mit demselben Namen freigegeben, und die Anfrage wird gewhrt, wobei alle anderen eingereihten Anfragen dafr vorangestellt werden.
  • signal: Ein AbortSignal kann bergeben werden, das es ermglicht, eine Sperranforderung abzubrechen. Dies kann verwendet werden, um eine Zeitberschreitung bei Anfragen zu implementieren.

berwachung

Die Methode navigator.locks.query() kann von Skripten verwendet werden, um den Zustand des Sperrmanagers fr den Ursprung zu introspektieren. Dies kann beim Debuggen ntzlich sein, z.B. um zu identifizieren, warum eine Sperre nicht erworben werden konnte. Die Ergebnisse sind ein Schnappschuss des Sperrmanager-Zustands, der gehaltene und angeforderte Sperren sowie einige zustzliche Daten (z.B. Modus) ber jede zum Zeitpunkt der Aufnahme des Schnappschusses identifiziert.

Erweiterte Nutzung

Fr kompliziertere Flle, wie das Halten der Sperre fr eine willkrlich lange Zeit, kann der Rckruf ein Promise explizit auflsen, das vom Skript aufgerufen wird:

js
// Capture promise control functions:
const { promise, resolve, reject } = Promise.withResolvers();

// Request the lock:
navigator.locks.request(
  "my_resource",
  // Lock is acquired.
  (lock) => promise, // Now lock will be held until either resolve() or reject() is called.
);

Deadlocks

Ein Deadlock tritt auf, wenn ein Prozess nicht mehr weiterarbeiten kann, weil jeder Teil auf eine Anfrage wartet, die nicht erfllt werden kann. Dies kann bei dieser API in komplexen Anwendungsfllen auftreten, z.B. wenn mehrere Sperren in der falschen Reihenfolge angefordert werden. Wenn Tab 1 Sperre A hlt und Tab 2 Sperre B hlt, dann versucht Tab 1 auch Sperre B zu erwerben und Tab 2 versucht auch Sperre A zu erwerben, kann keine der Anfragen gewhrt werden. Webanwendungen knnen dies durch verschiedene Strategien vermeiden, wie z.B. sicherzustellen, dass Sperranforderungen nicht verschachtelt sind, oder immer gut geordnet oder mit Zeitberschreitungen versehen sind. Beachten Sie, dass solche Deadlocks nur die Sperren selbst und den von ihnen abhngigen Code betreffen; der Browser, andere Tabs und andere Skripte auf der Seite sind nicht betroffen.

Schnittstellen

Lock

Bietet den Namen und den Modus einer zuvor angeforderten Sperre, die im Rckruf an LockManager.request() empfangen wird.

LockManager

Bietet Methoden zum Anfordern eines neuen Lock-Objekts und zum Abfragen eines vorhandenen Lock-Objekts. Um eine Instanz von LockManager zu erhalten, rufen Sie navigator.locks auf.

Erweiterungen zu anderen Schnittstellen

Gibt ein LockManager-Objekt zurck, das Methoden zum Anfordern eines neuen Lock-Objekts und zum Abfragen eines vorhandenen Lock-Objekts bietet.

WorkerNavigator.locks Schreibgeschtzt

Gibt ein LockManager-Objekt zurck, welches Methoden bietet, um ein neues Lock-Objekt anzufordern und ein vorhandenes Lock-Objekt abzufragen.

Spezifikationen

Spezifikation
Web Locks API

Browser-Kompatibilitt

api.LockManager

api.Lock


Web Proxy Viewer  |  New URL  |  Original Page