Start · Sprachen · JavaScript · Referenz · Lock.mode

Lock.mode

Eigenschaft

Nur lesbare Eigenschaft, die den Zugriffsmodus (<code>"exclusive"</code> oder <code>"shared"</code>) eines gehaltenen Locks aus der Web Locks API liefert.

seit JavaScript Baseline 2022: Chrome 69, Edge 79, Firefox 96, Saf Kategorie: webapi

Signatur

Lock.mode

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

Typ
"exclusive" | "shared"
Beschreibung
Ein String mit dem Zugriffsmodus, in dem das Lock gewährt wurde.

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);
});
cache-update exclusive

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' })]);
Start (shared) Start (shared) Ende (shared) Ende (shared) Start (exclusive) Ende (exclusive)

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));
gehalten: db shared

// 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 shared auf exclusive gibt 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") wirft request() einen TypeError.
  • Die Kombination mode: "shared" mit steal: true ist nicht erlaubt und führt zu einem NotSupportedError.
  • 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.