ServiceWorkerContainer.ready for a specific scriptURL?

ServiceWorkerContainer.ready for a specific scriptURL?

本文关键字:scriptURL specific ready for ServiceWorkerContainer      更新时间:2023-09-26

ServiceWorkerContainer.ready解析为活动的ServiceWorkerRegistration,但如果有多个服务工作线程在起作用(例如,来自上一页加载的服务工作线程,同一页面中的多个注册),则可以解析为多个服务工作线程。如何确保在执行代码块时,特定服务工作线程正在处理网络事件?

也就是说,我怎样才能编写一个可以按如下方式使用的函数registerReady(scriptURL, options)

registerReady("foo.js").then(function (r) {
    // "foo.js" is active and r.active === navigator.serviceWorker.controller
    fetch("/"); // uses foo.js's "fetch" handler
});
registerReady("bar.js").then(function (r) {
    // "bar.js" is active and r.active === navigator.serviceWorker.controller
    fetch("/"); // use bar.js's "fetch" handler
});

首先,请注意,每个作用域只能有一个活动服务工作进程,客户端页面最多只能由一个服务工作进程控制。因此,当准备就绪时,您肯定知道控制页面的服务工作者处于活动状态。

要了解任意 sw 是否处于活动状态,您可以注册它并检查注册中的服务工作线程队列并侦听其状态的变化。例如:

function registerReady(swScript, options) {
  return navigator.serviceWorker.register(swScript, options)
  .then(reg => {
    // If there is an active worker and nothing incoming, we are done.
    var incomingSw = reg.installing || reg.waiting;
    if (reg.active && !incomingSw) {
      return Promise.resolve();
    }
    // If not, wait for the newest service worker to become activated.
    return new Promise(fulfill => {
      incomingSw.onstatechange = evt => {
        if (evt.target.state === 'activated') {
          incomingSw.onstatechange = null;
          return fulfill();
        }
      };
    });
  })
}

希望这对你有意义。