如何访问服务工作者中的Web Workers?

时间:2017-01-28 15:15:29

标签: javascript web-worker service-worker

我最近和serviceworker工作很多,并且经常遇到这样的情况:我希望在将它存储到serviceworker缓存之前处理一些原始数据 - 例如用例将是处理一个大原始文本文件,以删除不必要的空白区域。这样,对我的http请求的缓存响应就已经“优化”了。

我在想,为什么不在网络工作者中这样做,但唉,经过多次搜索,我还没有发现如何在服务人员内部访问网络工作者。这不像我可以使用postMessage传递webworker上下文。

问题
如何访问服务工作者中的Web Workers?

1 个答案:

答案 0 :(得分:3)

目前无法从服务工作者中访问Web工作者。这可能在将来发生变化,相关标准问题为https://github.com/whatwg/html/issues/411

请注意,可以在由正常网页生成的Web工作者中使用Cache Storage API,因此理论上您可以在服务工作者的上下文之外执行您的建议。

这是个人偏好的问题,而不是严格的指导方针,但我不喜欢修改从网络返回的数据,然后使用Cache Storage API将其保存在合成中的模式{ {1}}对象。我更喜欢使用Cache Storage API来保存从网络中返回的内容的精确副本,这样无论是从网络还是从缓存中完成请求,对于受控页面看起来都是一样的。

我之前使用过的模式,以您建议的方式使用Web工作者的额外好处是以类似的方式使用IndexedDB。如果响应已经在IndexedDB中,那么您只需使用它,如果不是,则启动Web工作人员来处理网络请求和处理,然后将结果存储在IndexedDB中以备将来使用。 / p>

Here's an example执行此操作的一些代码,使用了大量ES2015 +功能,以及用于异步代码的promise-workeridb-keyval库。

Response

然后工作人员可以查看like this(将Markdown转换为HTML):

import PromiseWorker from 'promise-worker';
import idbKeyValue from 'idb-keyval';

export default async (url, Worker) => {
  let value = await idbKeyValue.get(url);
  if (!value) {
    const promiseWorker = new PromiseWorker(new Worker());
    value = await promiseWorker.postMessage(url);
    // Don't await here, so that we can return right away.
    idbKeyValue.set(url, value);
  }
  return value;
};

如果你处理大量数据,这种方法会开始变得不那么有意义了,因为序列化的开销和streaming support的缺乏与可能的只是直接使用Cache Storage API。