SharedWorker 共享worker数据

原文链接: SharedWorker 共享worker数据

上一篇: vite 提交PR 支持CJS引入 [已经被拒了]

下一篇: B站 av和bv号互转 py和js版 bigint

参考

你不知道的 Web Workers (上)[7.8K 字 | 多图预警]

https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker

普通的worker一般作为无状态的异步纯函数, 用于做计算使用, 两个页面实例化同一个路径的worker时, worker中的数据是独立的.

SharedWorker 被多个页面实例化时, 数据是共享的

下面这个点赞的例子中, 一个页面点赞多次, 再次打开其他页面时, 数据会保持同步, 通过port监听数据所以第二个页面发送的数据会改变worker中的数据, worker发出的数据只会被第二个页面收到, 第一个页面是收不到的

由于worker中的log在console中看不到, 所以需要使用inspect查看

共享worker时, 注意修改代码要关闭所有页面后再次打开才能看到新的代码, 或者在inspect中关闭, 否则是缓存的旧代码

共享点赞次数的例子

index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8"/>
  <title>共享线程 Shared Worker</title>
</head>
<body>
<button id="likeBtn">点赞</button>
<p>一共收获了<span id="likedCount">0</span>个👍</p>
<script>
  let likeBtn = document.querySelector("#likeBtn");
  let likedCountEl = document.querySelector("#likedCount");
  let worker = new SharedWorker("sw.js");
  console.log('worker.port', worker.port)
  worker.port.start();
  likeBtn.addEventListener("click", function () {
    worker.port.postMessage("like");
  });
  worker.port.onmessage = function (val) {
    likedCountEl.innerHTML = val.data;
  };
</script>
</body>
</html>

sw.js

let a = 666;

console.log("shared-worker");
onconnect = function (e) {
  const port = e.ports[0];
  console.log("shared-worker connect");

  // 不能使用这种方式监听事件
  // port.addEventListener('message', () => {
  //   port.postMessage(++a);
  // });

  port.postMessage(a);
  
  port.onmessage = () => {
    port.postMessage(++a);
  }
};

调试worker

chrome://inspect/#workers

up-19ff9b606dee8c0f059362b0ff6014324fe.png

点击inspect就可以看到了

up-48e8315214e9ce1a002144a57c97956c347.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值