javascript - 延迟 Service Worker 更新检查的正确方法是什么?

标签 javascript service-worker

我只想让 Service Worker 更新检查发生,例如在使用应用程序 5 分钟后进行。

问题是因为它被包裹在

window.addEventListener('load', async () => {
        navigator.serviceWorker.register("/serviceWorker.js");      
        const registration = await navigator.serviceWorker.getRegistration();

它在加载时开始检查。

为了解决这个问题,我将 Service Worker init 放入一个可以随时调用的函数中,但当然,它会失败,因为......

window.addEventListener('load', async ()

在窗口加载后调用。

延迟 Service Worker 检查的总体思路是什么?

最佳答案

我会考虑等待ServiceWorkerContainer.register() .

以下 registerSingletonServiceWorkerUrls 实现演示了如何注册服务工作线程 URL 并检索结果 ServiceWorkerRegistration根据需要使用Promise s。

/**
 * Registers the given service worker
 * URLs (if not already registered).
 *
 * @returns The resulting value of the current client's
 * `ServiceWorkerContainer`'s `ServiceWorkerRegistration`.
 * 
 * Example use:
 * ```
 * const latestServiceWorkerRegistration = await registerSingletonServiceWorkerUrls(
 *     '/service_worker_1.js',
 *     '/service_worker_2.js',
 * )
 * ```
 */
function registerSingletonServiceWorkerUrls(
    ...serviceWorkerUrls
) {
  return new Promise(
      async resolve => {
        // Wait for the document to finish loading (if applicable):
        while (document.readyState !== 'complete') await tick()

        for (const url of serviceWorkerUrls) {
          // Avoid duplicate registrations:
          if (registeredServiceWorkerUrls.has(url)) continue

          // Register the URL:
          await navigator.serviceWorker.register(url)
          registeredServiceWorkerUrls.add(url)
        }

        // Retrieve the resulting `ServiceWorkerRegistration`:
        const registration = await navigator.serviceWorker.getRegistration()
        return resolve(registration)
      }
  )
}

let registeredSingletonServiceWorkerUrls = new Set()

function tick() {
  return new Promise(window.requestIdleCallback)
}

关于javascript - 延迟 Service Worker 更新检查的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75845377/

相关文章:

javascript - 为什么原型(prototype)需要实例而不是函数 self

javascript - 两个令人困惑的 Javascript 测验

javascript - 当我尝试缓存 xxx.worker.js 时,Service Worker 不会安装

javascript - 将服务 worker 请求中的响应修改为图像

javascript - 如何强制将链接另存为,下载链接,而不是忽略事件的服务人员?

javascript - 缩短这些 javascript (JQuery) 函数

javascript - 发送带有数据的事件

javascript - 如何安装 Flatpickr 插件

javascript - 在 fetchEvent 中返回请求作为响应

service-worker - 工作箱:清理缓存