Service Worker 中的 Long-运行 进程(或类似的东西)
Long-running process inside a Service Worker (or something similar)
我有一个使用 IndexedDB 存储其状态的客户端 JS 应用程序。工作正常。但是,它有点慢,因为我经常读取和写入 IndexedDB,以便在打开多个选项卡时状态不会变得不一致。
我的想法是...将所有数据库访问内容放入 Service Worker 中,然后我可以在内存中缓存值,而不必担心另一个选项卡可能更改了数据库。
这似乎工作正常,除了我的应用程序的某些部分需要很长时间才能完成 运行。我可以将 Service Worker 的状态(如 "X% done")传达给我的 UI。但是如果 运行 超过 30 秒,Firefox 和 Chrome 似乎都会杀死工人,这对我来说太短了。
有什么办法可以解决这个限制吗?如果没有,有什么想法可以实现类似的目标吗?我认为 Shared Worker 可以做到这一点,除了浏览器支持很差,而且我预计现在不会随着 Service Workers 背后的势头而有所改善。
关于服务工作者的Google文档告诉我们,使用服务工作者作为内存缓存是不可能的:
It's terminated when not in use, and restarted when it's next needed, so you cannot rely on global state within a service worker's onfetch and onmessage handlers. If there is information that you need to persist and reuse across restarts, service workers do have access to the IndexedDB API.
我的建议是继续使用service workers将数据持久化到数据库,并使用localStorage创建一个shared cache between pages。进行更改的选项卡然后负责更新 localStorage 中的缓存并通过 service worker 持久保存到 IndexedDB。
正如您自己所说,SharedWorkers 似乎正是您所需要的。
我不确定为什么您认为实施 ServiceWorkers 背后的势头会阻止浏览器支持 SharedWorkers。他们似乎是两种不同的野兽。
据我了解,当您的应用程序处于离线状态时,应将 ServiceWorkers 用作请求的代理,并且应在 WebWorkers 和 SharedWorkers 中完成繁重的工作
https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API
https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker
我最终使用了 Shared Worker。在不支持 Shared Workers 的浏览器中,例如 Edge 和 Safari,我回退到 Web Worker 和一些骇人听闻的代码,让您一次只能在一个选项卡中打开应用程序。
因为我 90% 的用户都在使用 Firefox 或 Chrome 无论如何,我认为这不是一个巨大的损失。
我还wrote a library(除其他事项外)规范化 Shared Workers 和 Web Workers 中使用的 API,所以我在这两种情况下都有完全相同的代码 运行,唯一的区别是是否工人用 Worker
或 SharedWorker
.
初始化
我有一个使用 IndexedDB 存储其状态的客户端 JS 应用程序。工作正常。但是,它有点慢,因为我经常读取和写入 IndexedDB,以便在打开多个选项卡时状态不会变得不一致。
我的想法是...将所有数据库访问内容放入 Service Worker 中,然后我可以在内存中缓存值,而不必担心另一个选项卡可能更改了数据库。
这似乎工作正常,除了我的应用程序的某些部分需要很长时间才能完成 运行。我可以将 Service Worker 的状态(如 "X% done")传达给我的 UI。但是如果 运行 超过 30 秒,Firefox 和 Chrome 似乎都会杀死工人,这对我来说太短了。
有什么办法可以解决这个限制吗?如果没有,有什么想法可以实现类似的目标吗?我认为 Shared Worker 可以做到这一点,除了浏览器支持很差,而且我预计现在不会随着 Service Workers 背后的势头而有所改善。
关于服务工作者的Google文档告诉我们,使用服务工作者作为内存缓存是不可能的:
It's terminated when not in use, and restarted when it's next needed, so you cannot rely on global state within a service worker's onfetch and onmessage handlers. If there is information that you need to persist and reuse across restarts, service workers do have access to the IndexedDB API.
我的建议是继续使用service workers将数据持久化到数据库,并使用localStorage创建一个shared cache between pages。进行更改的选项卡然后负责更新 localStorage 中的缓存并通过 service worker 持久保存到 IndexedDB。
正如您自己所说,SharedWorkers 似乎正是您所需要的。 我不确定为什么您认为实施 ServiceWorkers 背后的势头会阻止浏览器支持 SharedWorkers。他们似乎是两种不同的野兽。
据我了解,当您的应用程序处于离线状态时,应将 ServiceWorkers 用作请求的代理,并且应在 WebWorkers 和 SharedWorkers 中完成繁重的工作
https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker
我最终使用了 Shared Worker。在不支持 Shared Workers 的浏览器中,例如 Edge 和 Safari,我回退到 Web Worker 和一些骇人听闻的代码,让您一次只能在一个选项卡中打开应用程序。
因为我 90% 的用户都在使用 Firefox 或 Chrome 无论如何,我认为这不是一个巨大的损失。
我还wrote a library(除其他事项外)规范化 Shared Workers 和 Web Workers 中使用的 API,所以我在这两种情况下都有完全相同的代码 运行,唯一的区别是是否工人用 Worker
或 SharedWorker
.