javascript - 访问服务 worker 中的对象

标签 javascript service-worker

美好的一天。有一个带有连接脚本的 html 页面,我可以从中访问某些对象(例如 object)。在 index.js 文件中,我可以访问这个对象。有一个函数接受 object 并从中返回一些数据:

const getObject = () => {
  let data = object.data;
  return data;
} 

如果我在 index.js 中调用这个函数,它工作正常,我可以访问 object。还有一个连接到 html 页面的服务人员。那里的一段代码:

self.addEventListner('message', event => {
   console.log('message' + event.data);
   importScripts('index.js');
   let data = getObject();
   console.log(data);
}

当我在 Service Worker 中调用 getObject 时,我得到一个错误:Uncaught ReferenceError: object is not defined at self.addEventListener (sw.js:33)。有一个问题:我怎样才能访问 service worker 中的 object

最佳答案

Service Worker 和您控制的页面位于两个完全不同的范围内,具有自己的一组符号。不可能在这两个范围内直接引用像 getObject() 这样的函数。

但是,可以使用将在两个范围之间创建代理的帮助程序库,基本上“伪造”一个本地接口(interface),该接口(interface)将实际调用远程方法并异步传回结果。

有几个这样的库。我知道很适合 service worker 通信的一个是 Comlink .

这是一个从 Comlink 的 README 借来的例子:

// main.js
const MyClass = Comlink.proxy(new Worker('worker.js'));
// `instance` is an instance of `MyClass` that lives in the worker!
const instance = await new MyClass();
await instance.logSomething(); // logs “myValue = 42”

// worker.js
const myValue = 42;
class MyClass {
  logSomething() {
    console.log(`myValue = ${myValue}`);
  }
}
Comlink.expose(MyClass, self);

关于javascript - 访问服务 worker 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51764834/

相关文章:

javascript - 使用 rubaxa 进行可排序的 Javascript

javascript - 单击过滤列表/ View

javascript - Console.log 在 if 语句中触发,但其余代码不会

javascript - 使用workbox的injectmanifest在vue.js中创建服务 worker 崩溃

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

reactjs - 更改路线时更新单页应用程序上的 "service-worker.js"

vue.js - 如何从 registerServiceWorker.js 调用 Vue 应用程序 $refs.components 或 Vuex $store 中的方法?

javascript - $firebaseArray 子记录的子节点上没有 ID

javascript - 阻止 JQuery promise 传播到包装器失败

javascript - 服务 worker 的网络推送通知