首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >客户端页和服务工作者之间的双向通信

客户端页和服务工作者之间的双向通信
EN

Stack Overflow用户
提问于 2020-04-03 17:32:23
回答 1查看 68关注 0票数 0

有一个由preact-cli (使用workbox)生成的preact应用程序,我的目标是在服务工作者上注册一个' message‘事件处理程序,发布来自该应用程序的一条消息,最后接收一个返回的响应。

类似于:

代码语言:javascript
复制
/* app.js */
navigator.serviceWorker.postMessage('marco');

const response = ? // get the response somehow
代码语言:javascript
复制
/* sw.js */
addEventListener('message', function (e) { return 'polo' });

我没有太多使用服务工作者的经验,有很多移动部件让我感到困惑,比如workbox对服务工作者施展魔法,预先隐藏注册服务工作者和服务工作者的代码,这通常很难调试。

到目前为止,我已经按照preact-cli文档的指示在src/目录中放置了一个sw.js文件:https://preactjs.com/cli/service-worker/

我知道我应该附加一个事件侦听器,但是我找不到关于要这样做的对象的文档。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-08 00:19:59

( Workbox和Preact都与这个问题没有太多关系。Workbox允许你在你的服务工作者中使用任何你想要的额外代码,Preact也应该用于你的客户端应用程序。)

This example page演示了如何使用MessageChannel将消息从客户机页发送到服务工作者,然后进行响应。客户端页面上使用的相关助手代码如下所示:

代码语言:javascript
复制
function sendMessage(message) {
  return new Promise(function(resolve, reject) {
    const messageChannel = new MessageChannel();
    messageChannel.port1.onmessage = function(event) {
      // The response from the service worker is in event.data
      if (event.data.error) {
        reject(event.data.error);
      } else {
        resolve(event.data);
      }
    };

    navigator.serviceWorker.controller.postMessage(message,
      [messageChannel.port2]);
  });
}

然后在您的服务工作线程中,您使用MessageChannel的端口来响应:

代码语言:javascript
复制
self.addEventListener('message', function(event) {
  // Your code here.

  event.ports[0].postMessage({
    error: // Set error if you want to indicate a failure.
    message: // This will show up as event.data.message.
  });
});

您也可以使用Comlink library来简化逻辑来做同样的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61008877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档