秒懂sharedWorker

本文以最简单的方式来了解sharedWorker的基本运用,即从一个标签页发送消息到另外一个标签页。

创建worker

以下便是创建worker的核心代码。

const worker = new SharedWorker('worker.js','my-worker');

这一步,需要在发送标签页,和接收消息的标签页进行。可以理解为双方都通过new SharedWorker(),共享了worker.js文件,代表这两个标签页已经连接到了worker。返回值可以理解为连接到worker的角色。

ps:new SharedWorker()第一个参数是共享的worker文件路径,第二个参数是worker名(不给的话会默认给一个名字),这个名字可以在chorme浏览器的chrome://inspect路径可以看到。

image.png 点击inspect即可进入worker的控制台,类似于终端,可以看到worker.js里面打印的内容。

发送消息的页面

发送消息的核心代码如下,就一行。

worker.port.postMessage("你想要发送的消息")

可以把它绑定到一个按钮上,来触发发送消息的这个操作。以下是发送消息页面的全部代码。

<!DOCTYPE html>
<html>
<head>
  <title>SharedWorker Example</title>
</head>
<body>
  <h1>Page 1</h1>
  <input type="text" id="message-input">
  <button id="send-button">Send message to Page 2</button>
  <script>
    const worker = new SharedWorker('worker.js','my-worker');// 连接到worker
    const port = worker.port;
    document.getElementById('send-button').addEventListener('click', function() {
      const message = document.getElementById('message-input').value;
      port.postMessage(message);// 发送消息
    });
  </script>
</body>
</html>

这里,我通过在一个按钮上绑定click事件,来获取输入框的内容,并通过发送消息的核心代码来把这个消息发送到worker。

worker接收并转发消息

发送到worker的消息,在worker.js里面需要对其进行处理,包括了接收消息和转发消息的内容。下面是worker.js文件里面的全部内容。

const connections = []; // 创建一个连接池
onconnect = function(e) {
  const port = e.ports[0];
  connections.push(port);// 连接后就把新的链接放到connections数组
  // 监听消息
  port.onmessage = function(e) {
    // 转发消息
    console.log('worker接收到消息!')
    connections.forEach(function(connection) {
      connection.postMessage(e.data);
    });
  };
};

首先是要创建一个连接池connections

onconnect是连接完成的事件,不用担心没有对它进行命名会报错,因为worker.js不是单纯的js运行脚本。

这里提供一个回调函数,代表连接成功,也就是创建worker那一步成功连接到worker会触发的事件。这里的port和创建worker里面的port是同一个东西。可以通过分别在worker里面和页面里面打印验证。

image.png port.onmessage代表监听消息,这里是在worker里面进行的监听。同样接收一个回调函数,来在worker里面进行接收消息后对应的操作。这里通过遍历连接池里面的连接,分别向池子里面的port发送消息。

接收消息的页面

在接收消息的页面同样也是通过port.onmessage来进行消息的接收。可以通过它来监听到刚刚worker.js文件里面进行转发的消息。进而进行接收到消息后的操作。

下列代码是接收到消息的全部内容,它的操作是将接收到的消息追加到ul里面。

<!DOCTYPE html>
<html>
<head>
  <title>SharedWorker Example</title>
</head>
<body>
  <h1>Page 2</h1>
  <ul id="message-list"></ul>
  <script>
    const worker = new SharedWorker('worker.js','my-worker');
    const port = worker.port;
    
    port.onmessage = function(e) {
      console.log('接收到消息!');
      const message = e.data;
      const li = document.createElement('li');
      li.textContent = message;
      document.getElementById('message-list').appendChild(li);
    };
  </script>
</body>
</html>

回顾

主要的点就是要知道worker.js负责的工作,和发送消息,接收消息需要负责的工作,之后再来找具体的api实现就行了。

建立一个sharedWork非常简单,主要就是几个api。在下面的代码块中罗列出来。通过自由组合,即可实现一些实际的应用啦~

// 连接到worker
const worker = new SharedWorker('worker.js','my-worker');
// 发送消息
port.postMessage('你想要发送的消息')
// 连接后的回调
onconnect = (e) => {
  const port = e.ports[0];
  console.log('这是已连接的port',port);
}
// 接收消息
port.onmessage = (e) => {
    console.log('这是接收到的消息:',e.data)
}

以下是实验结果。

image.png

全部评论

相关推荐

KPLACE:首先是板面看起来不够,有很多奖,比我厉害。项目要精减,大概详细描述两到三个,要把技术栈写清楚,分点,什么算法,什么外设,怎么优化,不要写一大堆,分点,你写上去的目的,一是让别人知道你做了这个知识点,然后在面试官技术面的时侯,他知道你会这个,那么就会跟你深挖这个,然后就是个人评价改为专业技能
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 听劝,这个简历怎么改 #
14146次浏览 183人参与
# 面试被问“你的缺点是什么?”怎么答 #
6586次浏览 100人参与
# 水滴春招 #
16681次浏览 378人参与
# 入职第四天,心情怎么样 #
11380次浏览 63人参与
# 租房找室友 #
8069次浏览 53人参与
# 读研or工作,哪个性价比更高? #
26200次浏览 356人参与
# 职场新人生存指南 #
199308次浏览 5519人参与
# 参加完秋招的机械人,还参加春招吗? #
27045次浏览 276人参与
# 文科生还参加今年的春招吗 #
4123次浏览 31人参与
# 简历无回复,你会继续海投还是优化再投? #
48642次浏览 561人参与
# 你见过最离谱的招聘要求是什么? #
144729次浏览 829人参与
# 如果重来一次你还会读研吗 #
155733次浏览 1706人参与
# 机械人选offer,最看重什么? #
69081次浏览 449人参与
# 选择和努力,哪个更重要? #
44339次浏览 494人参与
# 如果再来一次,你还会学硬件吗 #
103659次浏览 1246人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
20532次浏览 414人参与
# 招聘要求与实际实习内容不符怎么办 #
46830次浏览 495人参与
# 22届毕业,是读研还是拿外包offer先苟着 #
4655次浏览 27人参与
# 你们的毕业论文什么进度了 #
901356次浏览 8961人参与
# 软开人,你觉得应届生多少薪资才算合理? #
81380次浏览 496人参与
# 国企还是互联网,你怎么选? #
109200次浏览 853人参与
牛客网
牛客企业服务