Signatur
Beschreibung
Die Eigenschaft Lock.mode gibt an, in welchem Zugriffsmodus ein Lock gewährt wurde. Der Wert entspricht der Option mode, die beim Aufruf von navigator.locks.request() übergeben wurde. Ohne Angabe gilt standardmäßig "exclusive".
Es gibt zwei Modi:
"exclusive": Ein Lock mit diesem Namen kann immer nur ein einziger Halter bekommen, egal ob exklusiv oder geteilt angefordert. Das eignet sich für Schreibzugriffe, etwa auf IndexedDB oder einen gemeinsamen Cache."shared": Mehrere Halter können das Lock gleichzeitig besitzen, solange kein exklusives Lock gehalten wird. Das eignet sich für parallele Lesezugriffe (Leser-Schreiber-Muster).
In der Praxis braucht man mode vor allem in generischen Hilfsfunktionen, die einen Callback mit unterschiedlichen Modi aufrufen, sowie für Logging und Debugging. Das Lock-Objekt steht nur innerhalb des Callbacks von request() zur Verfügung. Die Übersicht aus navigator.locks.query() liefert dagegen einfache Objekte (LockInfo) mit einem eigenen mode-Feld.
Rückgabewert
Beispiele
Standardmodus eines Locks auslesen
await navigator.locks.request('cache-update', async (lock) => {
// Ohne mode-Option wird exklusiv gesperrt
console.log(lock.name, lock.mode);
});
Leser-Schreiber-Muster mit shared und exclusive
const withLock = (mode, task) =>
navigator.locks.request('settings', { mode }, async (lock) => {
console.log(`Start (${lock.mode})`);
const result = await task();
console.log(`Ende (${lock.mode})`);
return result;
});
const readSettings = () => withLock('shared', async () => {
return JSON.parse(localStorage.getItem('settings') ?? '{}');
});
const writeSettings = (data) => withLock('exclusive', async () => {
localStorage.setItem('settings', JSON.stringify(data));
});
// Zwei Leser laufen parallel, der Schreiber wartet auf beide
await Promise.all([readSettings(), readSettings(), writeSettings({ theme: 'dark' })]);
Modus gehaltener und wartender Locks über query() prüfen
navigator.locks.request('db', { mode: 'shared' }, () => new Promise((r) => setTimeout(r, 1000)));
const { held, pending } = await navigator.locks.query();
held.forEach((info) => console.log('gehalten:', info.name, info.mode));
pending.forEach((info) => console.log('wartend:', info.name, info.mode));
// Wichtig · Fallstricke
- Die Eigenschaft ist nur lesbar. Wer einen anderen Modus braucht, gibt das Lock frei und fordert es neu an. Ein nachträgliches „Hochstufen“ von
sharedaufexclusivegibt es nicht. Fordert man innerhalb eines Shared-Callbacks dasselbe Lock exklusiv an, entsteht ein Deadlock. - Bei ungültigen Werten für die Option
mode(z. B."read") wirftrequest()einenTypeError. - Die Kombination
mode: "shared"mitsteal: trueist nicht erlaubt und führt zu einemNotSupportedError. - Die Web Locks API gibt es nur in sicheren Kontexten (HTTPS). Sie gilt pro Origin und reicht über Tabs und Worker hinweg. Unterstützt wird sie in allen aktuellen Browsern (Firefox ab 96, Safari ab 15.4), auch in Web Workern.
- Werden viele Shared-Locks ständig nacheinander angefordert, kann ein wartendes exklusives Lock verhungern. Die Anfragen werden aber in der Reihenfolge ihres Eingangs abgearbeitet.