| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/API/Web_Locks_API | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
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.
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:
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:
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:
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();
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.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.
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:
// 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.
);
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.
LockBietet den Namen und den Modus einer zuvor angeforderten Sperre, die im Rckruf an LockManager.request() empfangen wird.
LockManagerBietet 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.
Navigator.locks SchreibgeschtztGibt ein LockManager-Objekt zurck, das Methoden zum Anfordern eines neuen Lock-Objekts und zum Abfragen eines vorhandenen Lock-Objekts bietet.
WorkerNavigator.locks SchreibgeschtztGibt ein LockManager-Objekt zurck, welches Methoden bietet, um ein neues Lock-Objekt anzufordern und ein vorhandenes Lock-Objekt abzufragen.
| Spezifikation |
|---|
| Web Locks API |
Der Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |