ServiceWorker:state 属性

Baseline 已广泛支持

此功能已成熟,可跨多种设备和浏览器版本工作。它自 ⁨2018 年 4 月⁩ 起已在所有浏览器中可用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Web Workers 中可用。

ServiceWorker 接口的只读属性 state 返回一个字符串,表示 service worker 的当前状态。它可以是以下值之一:parsedinstallinginstalledactivatingactivatedredundant

一个 String,可以取以下值之一

"parsed"

service worker 下载并确认可运行后的初始状态。service worker 永远不会更新到此状态,因此它永远不会是 statechange 事件的值。

"installing"

此状态下的 service worker 被视为正在安装的 worker。在此状态下,可以在 install 事件处理程序内部调用 ExtendableEvent.waitUntil() 来延长正在安装的 worker 的生命周期,直到传入的 Promise 成功解析。这主要用于确保 service worker 在所有核心缓存填充完毕之前不会处于活动状态。

"installed"

此状态下的 service worker 被视为一个等待中的 worker。

"activating"

此状态下的 service worker 被视为一个活动的 worker。在此状态下,可以在 onactivate 事件处理程序内部调用 ExtendableEvent.waitUntil() 来延长活动的 worker 的生命周期,直到传入的 Promise 成功解析。在状态变为 activated 之前,不会分派任何功能性事件。

"activated"

此状态下的 service worker 被视为一个已准备好处理功能性事件的活动 worker。

"redundant"

一个新的 service worker 正在替换当前的 service worker,或者当前的 service worker 由于安装失败而被丢弃。

示例

此代码片段来自 service worker registration-events 示例在线演示)。该代码监听 ServiceWorker.state 的任何变化并返回其值。

js
let serviceWorker;
if (registration.installing) {
  serviceWorker = registration.installing;
  document.querySelector("#kind").textContent = "installing";
} else if (registration.waiting) {
  serviceWorker = registration.waiting;
  document.querySelector("#kind").textContent = "waiting";
} else if (registration.active) {
  serviceWorker = registration.active;
  document.querySelector("#kind").textContent = "active";
}

if (serviceWorker) {
  logState(serviceWorker.state);
  serviceWorker.addEventListener("statechange", (e) => {
    logState(e.target.state);
  });
}

规范

规范
Service Workers
# service-worker-state

浏览器兼容性