1. Soalan
Beberapa tab asal yang sama (same-origin) mungkin menyegarkan cache IndexedDB dan menyelaraskan dengan pelayan secara serentak. Reka satu penyelaras yang membenarkan paling banyak satu konteks untuk membuat penyelarasan manakala tab lain menunggu, melangkau, atau menyemak semula selepas kunci dilepaskan. Rangkumi penutupan tab, ralat rangkaian, dan pelayar tanpa sokongan Web Locks.
2. Kekangan dan penjelasan
- Nama kunci dikongsi merentasi tetingkap dan worker daripada asal yang sama (same-origin).
- Kunci hanya melindungi skop penyelarasan panggilan balik tak segerak (asynchronous callback); ia bukan transaksi pangkalan data atau kawalan kebersamaan (concurrency control) bahagian pelayan.
- Penyelarasan mungkin mengambil masa, jadi ia memerlukan pembatalan, percubaan semula, dan siaran versi atau hasil.
- Bezakan antara menunggu kunci, memeriksa serta-merta, dan membatalkan permintaan.
3. Pendekatan teras
Panggil navigator.locks.request(name, options, callback) untuk meminta kunci yang dinamakan. Kunci akan dilepaskan selepas Promise bagi panggilan balik diselesaikan, jadi panggilan balik tersebut mesti mengandungi keseluruhan aliran baca, selaras, dan tulis keadaan. Permintaan lalai akan dibariskan; ifAvailable: true membuat panggilan balik dengan null apabila sibuk; signal boleh membatalkan permintaan yang masih menunggu.
Pengurus kunci melepaskan kunci apabila konteks pemiliknya ditamatkan, tetapi ketepatan tidak boleh bergantung hanya pada pembersihan nahas tab. Rekod penyelarasan harus mengandungi versi, pajakan (lease), atau kunci ketakberubahan (idempotency key), dan pelayan masih perlu mengesahkan penulisan. Tab lain boleh mengetahui versi baharu melalui BroadcastChannel atau dengan membaca semula IndexedDB.
4. Pelaksanaan rujukan
const LOCK = "shared-cache-sync";
async function runSync(signal) {
return navigator.locks.request(LOCK, { signal }, async (lock) => {
if (!lock) return { status: "busy" };
const current = await readSyncVersion();
if (await isFresh(current)) return { status: "fresh" };
const result = await fetchAndWriteCache({ signal, baseVersion: current });
await publishVersion(result.version);
return { status: "updated", version: result.version };
});
}
async function trySyncWithoutWaiting() {
return navigator.locks.request(
LOCK,
{ ifAvailable: true },
(lock) => lock ? runOneSync() : { status: "busy" },
);
}5. Ketepatan dan pengendalian kegagalan
Kunci menyediakan pengecualian saling (mutual exclusion) antara konteks same-origin bagi sumber yang dinamakan; ia tidak mengembalikan (roll back) permintaan rangkaian atau penulisan pangkalan data. Baca semula versi sebelum melakukan kemas kini bersyarat. Jika rangkaian gagal, lontarkan ralat supaya kunci dilepaskan dan permintaan seterusnya boleh mencuba semula. Jangan simpan nilai boolean "kami memiliki kunci" di luar panggilan balik.
Apabila AbortSignal membatalkan permintaan yang sedang menunggu, pemanggil harus membezakan antara pembatalan dan kegagalan perniagaan. Untuk tempoh menunggu yang panjang, tunjukkan bahawa tab lain sedang menyelaraskan data atau langkau kerja tersebut; selepas kunci dilepaskan, baca semula versi bagi mengelakkan penyegaran pendua. Pemberitahuan melalui BroadcastChannel merupakan satu pengoptimuman; IndexedDB atau pelayan tetap kekal berwibawa.
6. Susulan dan perangkap
- Web Locks hanya menyelaras konteks same-origin; ia tidak boleh mengunci tapak lain, proses pelayan, atau baris pangkalan data.
ifAvailabletidak dibariskan. Permintaan yang sibuk menerimanull, yang merupakan hasil yang normal.steal: truememecahkan semantik baris gilir sedia ada dan harus dihadkan kepada kerja yang boleh dibuang secara eksplisit dengan semakan versi.- Tanpa API ini, BroadcastChannel bersama IndexedDB boleh menyediakan penyelarasan usaha terbaik (best-effort), bukannya jaminan pengecualian saling yang serupa; pelayan masih memerlukan penyahduplikasian.
7. Rujukan lanjutan
Bandingkan Web Locks, transaksi IndexedDB, mesej Service Worker, dan BroadcastChannel: kunci menyediakan pengecualian merentasi konteks, transaksi menyediakan keatoman pangkalan data tunggal, dan saluran menyediakan pemberitahuan. Pengecualian merentasi peranti atau merentasi pengguna adalah di bawah tanggungjawab pajakan pelayan, API idempoten, atau kekangan pangkalan data.
8. Mata penilaian temu duga
Boleh menyatakan skop kunci
Calon harus menyatakan bahawa kunci yang dinamakan menyelaras tetingkap dan worker same-origin, dilepaskan apabila Promise panggilan balik diselesaikan, dan tidak boleh menggantikan kawalan kebersamaan pelayan atau pangkalan data.
Boleh membezakan mod permintaan
Mereka harus menerangkan pembarisan gilir lalai, pemeriksaan segera ifAvailable, dan tindakan membatalkan penungguan dengan AbortSignal.
Boleh mengendalikan nahas dan pendua
Mereka harus menggunakan versi, kunci ketakberubahan (idempotency keys), dan penulisan bersyarat, serta menjelaskan bahawa pembersihan nahas tab tidak mengembalikan penulisan perniagaan.
Boleh memberikan sandaran yang jujur
Mereka harus menyediakan laluan usaha terbaik BroadcastChannel/IndexedDB dan menyatakan bahawa pengecualian saling adalah lebih lemah manakala perlindungan pelayan kekal wajib.