本文详解在 Chrome 桌面端使用 navigator.wakeLock 时为何调用 release() 报错“is not a function”,并提供可立即运行的异步释放方案,强调 Promise 链式处理与兼容性检查。
本文详解在 chrome 桌面端使用 `navigator.wakelock` 时为何调用 `release()` 报错“is not a function”,并提供可立即运行的异步释放方案,强调 promise 链式处理与兼容性检查。
Web Wake Lock API 允许网页在用户无操作时保持屏幕常亮(如播放视频、演示文稿或数据监控页面),但其设计严格遵循异步规范:navigator.wakeLock.request('screen') 返回的是一个 Promise,而非直接的 WakeLock 实例。因此,若未等待 Promise 解析就尝试调用 .release(),就会触发 wakeLock.release is not a function 错误——因为此时 wakeLock 变量实际保存的是 Promise 对象,而 Promise 并没有 release 方法。
必须确保 release() 在已解析的 WakeLock 实例上调用。以下是推荐的完整实现模式:
let wakeLock = null;// ✅ 请求并持有唤醒锁(需在用户交互后调用,如点击事件)async function requestWakeLock() { try { if ('wakeLock' in navigator) { wakeLock = await navigator.wakeLock.request('screen'); console.log('✅ Screen wake lock acquired'); // 可选:监听释放事件(例如被系统强制释放时) wakeLock.addEventListener('release', () => { console.log('⚠️ Wake lock was released automatically'); wakeLock = null; }); } else { console.warn('❌ Wake Lock API not supported'); } } catch (err) { console.error('❌ Failed to acquire wake lock:', err.name, err.message); }}// ✅ 安全释放唤醒锁async function releaseWakeLock() { if (!wakeLock) return; try { await wakeLock.release(); // ✅ 直接 await 实例方法(现代写法,更清晰) console.log('✅ Wake lock released'); wakeLock = null; } catch (err) { console.warn('⚠️ Release failed or already released:', err.name); }}
? 注意事项:
- 调用时机限制:wakeLock.request() 必须在用户手势(如 click、keydown)触发的上下文中执行,否则会抛出 NotAllowedError;
- 浏览器兼容性:仅 Chromium 88+(Chrome/Edge)及 Firefox 119+ 支持,务必前置检测 if ('wakeLock' in navigator);
- 资源管理:应在页面卸载前(如 beforeunload)或功能结束时主动调用 releaseWakeLock(),避免锁长期占用;
- 错误容忍:wakeLock.release() 可被多次调用(幂等),但释放后再次调用会返回已 fulfilled 的 Promise,无需额外判空。
// ❌ 错误:未 await,wakeLock 是 Promise,不是 WakeLock 实例const wakeLock = navigator.wakeLock.request('screen'); // ← 返回 PromisewakeLock.release(); // TypeError!// ❌ 错误:混淆 Promise 和实例,用 then 调用 release(冗余且易错)wakeLock.then(wl => wl.release()); // 虽能工作,但不推荐;应统一用 async/await
document.addEventListener('visibilitychange', () => { if (document.hidden && wakeLock) { releaseWakeLock(); }});
通过以上结构化实现,即可在 Windows Chrome 桌面环境中稳定、安全地管理屏幕唤醒锁,彻底规避 release is not a function 类型错误。