所以事实证明,你实际上不能从你的应用程序调用一个 SW 中的方法(由于生命周期问题),所以你必须使用 postMessage API 来传递序列化的 JSON 消息(所以没有传递回调等)。
您可以使用以下应用代码向控制软件发送消息:
navigator.serviceWorker.controller.postMessage({'hello': 'world'})
结合SW代码中的以下内容:
self.addEventListener('message', function (evt) {
console.log('postMessage received', evt.data);
})
这会在我的 SW 控制台中产生以下结果:
postMessage received Object {hello: "world"}
因此,通过传入一个消息(JS 对象),该消息指示我要调用的事件侦听器的函数和参数,可以接收它并在 SW 中调用正确的函数。要将结果返回给应用程序代码,您还需要将 MessageChannel 的端口传递给 SW,然后通过 postMessage 响应,例如在您创建的应用程序中并通过 MessageChannel 发送数据:
var messageChannel = new MessageChannel();
messageChannel.port1.onmessage = function(event) {
console.log(event.data);
};
// This sends the message data as well as transferring messageChannel.port2 to the service worker.
// The service worker can then use the transferred port to reply via postMessage(), which
// will in turn trigger the onmessage handler on messageChannel.port1.
// See https://html.spec.whatwg.org/multipage/workers.html#dom-worker-postmessage
navigator.serviceWorker.controller.postMessage(message, [messageChannel.port2]);
然后您可以在消息处理程序中的 Service Worker 中通过它进行响应:
evt.ports[0].postMessage({'hello': 'world'});