跨项目实时通信——Broadcast Channel

该文章已生成可运行项目,

一、背景

在日常开发中,肯定会遇到一些需要跨项目实时通信的场景。比如在浏览器中新开两个tab页面,A页面发送消息后,B页面实时监听并触发某些动作。类似的需求有很多,比如实时共享状态等等。那么跨项目/页面/浏览器tab的情况下如何实现通信呢?大家肯定第一时间会想到很多方案,可是如何实现实时通信呢???除了postMessage,sharedworker外,今天说下Broadcast Channel如何实现实时通信

二、介绍&使用

1、先来看下官方解释:

BroadcastChannel 接口代理了一个命名频道,可以让指定 origin 下的任意 browsing context 来订阅它。它允许同源的不同浏览器窗口,Tab 页,frame 或者 iframe 下的不同文档之间相互通信。通过触发一个 message 事件,消息可以广播到所有监听了该频道的 BroadcastChannel 对象。

简单的说,就是需要在同源的情况下,实现浏览器多窗口实时进行通信,且该通信是广播进行的。

2、初始化一下BroadcastChannel

new BroadcastChannel(channelName)

channelName表示通道名称的字符串;对于相同的来源下的所有浏览上下文,一个名称只对应一个通道。是string类型,用来标识当前的BroadcastChannel

eg:

// 创建一个监听“test_cyl”通道的新通道。

const bc = new BroadcastChannel("test_cyl")

3、发送消息

可以使用postMessage() 发送一条消息,给所有同源下监听了该频道的所有浏览器。消息message事件的形式发送给每一个绑定到该频道的广播频道

eg:


const bc = new BroadcastChannel("test_cyl")

// 发送消息通知
bc.postMessage(object);

4、监听消息

发送事件后,如何使用进行消息的监听呢?当频道收到一条消息时,会在关联的BroadcastChannel对象上触发 message 事件,监听方式有两种,具体如下

eg:

const bc = new BroadcastChannel("test_cyl")
// 消息监听 方式一
bc.onmessage = (event) => { }



// 消息监听 方式二
bc.addEventListener('message', (event) => { })

除了正常的消息监听外,还提供了一错误消息的监听。当频道收到一条无法反序列化的消息时,会在 BroadcastChannel 对象上触发 messageerror 事件。如下:

const bc = new BroadcastChannel('test_cyl');

// 方式一
bc.addEventListener('messageerror', (event) => {
  console.error(event);
})

// 方式二
bc.onmessageerror = (event) => {
  console.log(event);
};

  5、断开

 通过调用 close() 方法,可以马上断开其与对应频道的关联,并让其被垃圾回收。这是必要的步骤,因为浏览器没有其他方式知道频道不再被需要。不断开可能会导致一直处于监听状态,消耗资源,会导致不能被内存回收

// 连接到指定频道
const bc = new BroadcastChannel('test_cyl');

// 其他操作 (如:postMessage, …)

// 当完成后,断开与频道的连接
bc.close();

三、浏览器支持程度

大家在使用的时候,一定要关注下浏览器兼容问题:

四、注意事项

1、BroadcastChannel不能跨域传输

2、当监听和发送使用同一个broadcastChannel实例的时候,发送的消息不能被监听到

以上就是针对Broadcast Channel的介绍,欢迎补充探讨!!!!

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值