ifAvailable 是 navigator.locks.request 的布尔选项,指定仅在锁空闲时立即获取,否则回调中 lock 为 null;需置于 options 对象中,配合锁名和回调使用,不支持 await 写法,且需主动判空处理。

什么是 navigator.locks.request 的 ifAvailable 选项
ifAvailable 是一个布尔型锁请求选项,用于告诉浏览器:只在锁当前空闲时立即获取,否则不排队、不等待、直接拒绝。它本质是「尝试一次,成则得,败则退」的非阻塞语义,和默认的排队等待行为截然不同。
这个选项特别适合 UI 交互类场景——比如用户点击「保存」按钮时,你希望立刻执行保存逻辑,但如果另一处(如后台同步)正持有同名锁,就该跳过或提示“操作已被其他任务占用”,而不是让按钮卡住、界面冻结。
如何正确传入 ifAvailable: true
必须把 ifAvailable 放在 request() 的第三个参数(即 options 对象)中;前两个参数分别是锁名和回调函数。漏掉或放错位置会导致选项被忽略,仍按默认阻塞行为执行。
-
ifAvailable不能单独使用,必须配合name和callback一起调用 - 不支持 Promise 风格的
await navigator.locks.request(...)写法——ifAvailable: true时,回调函数里的lock参数可能为null,需主动判断 - 示例写法:
navigator.locks.request('save-lock', async (lock) => {
if (!lock) {
console.warn('锁不可用,跳过执行');
return;
}
await doSave();
}, { ifAvailable: true });
ifAvailable: true 下的常见错误现象与排查
最典型的误判是:以为回调没执行就是失败了,其实回调一定执行,只是 lock 参数为 null。开发者常因此漏掉 if (!lock) 检查,导致后续代码报 Cannot read property 'mode' of null 或静默失败。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
立即学习“前端免费学习笔记(深入)”;
- 错误写法:
lock.mode直接访问,未判空 - 锁名拼写不一致(如一处用
'save-lock',另一处用'save_lock'),导致看似没冲突,实则互不影响,ifAvailable失去意义 - 在非安全上下文(HTTP 页面、iframe 无
allow="clipboard-write"等)中调用,整个navigator.locksAPI 不可用,会抛ReferenceError: navigator.locks is not defined
兼容性与实际可用边界
navigator.locks 目前仅在 Chromium 117+(含 Edge)、Firefox 120+ 中稳定支持,Safari 完全不支持。且要求页面运行在 HTTPS 或 localhost 上;HTTP 页面即使 Chrome 版本够新,也会静默禁用该 API。
如果你的应用需要降级处理,建议封装一层 fallback 逻辑:先检测 navigator.locks 是否存在,再检查是否支持 ifAvailable(可通过 try/catch 调用一次带该选项的 request 并观察是否抛错),否则退回到内存标记(如 window.__isSaving = true)这类简易互斥手段。
真正容易被忽略的是:锁的生命周期完全由回调函数的执行时长决定——哪怕你用了 ifAvailable: true,一旦拿到锁,就必须等回调结束(或显式 return)才会释放。别在回调里启动一个长期运行的 setTimeout 就不管了,那锁就永远挂在那里。


















