Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么创建同一广播频道的多个实例会导致浏览器冻结?_Javascript_Browser_Freeze_Broadcast Channel - Fatal编程技术网

Javascript 为什么创建同一广播频道的多个实例会导致浏览器冻结?

Javascript 为什么创建同一广播频道的多个实例会导致浏览器冻结?,javascript,browser,freeze,broadcast-channel,Javascript,Browser,Freeze,Broadcast Channel,最近,我在Chrome中使用API广播频道时遇到了一个奇怪的问题。 我有一个需要从其他选项卡获取数据的选项卡,所以我使用BroadcastChannel将其存档 当用户单击该按钮时,它将触发一个postMessage到正在收听同一广播频道的目标选项卡 const sendData = data => { const broadcast = new BroadcastChannel('viewDataChannel') broadcast.postMessage(data);

最近,我在Chrome中使用API广播频道时遇到了一个奇怪的问题。 我有一个需要从其他选项卡获取数据的选项卡,所以我使用BroadcastChannel将其存档

当用户单击该按钮时,它将触发一个
postMessage
到正在收听同一广播频道的目标选项卡

const sendData = data => {
    const broadcast = new BroadcastChannel('viewDataChannel')
    broadcast.postMessage(data);
};
// ...
<Button onClick={data => sendData(data)}>Send data</Button>
// Receiver
const broadcast = new BroadcastChannel('viewDataChannel');
broadcast.postMessage = data => setData(data);
const sendData=data=>{
const broadcast=新广播频道('viewDataChannel')
广播。后消息(数据);
};
// ...
sendData(数据)}>发送数据
//接受者
const broadcast=新广播频道(“viewDataChannel”);
broadcast.postMessage=data=>setData(数据);
一切正常,直到它不正常为止。在生产过程中,用户经常点击按钮,点击几下(可能10次)之后,Chrome就冻结了(高RAM和CPU使用率,我的应用程序也冻结了),我不得不关闭浏览器并重新启动它

我通过将代码create BroadcastChannel实例移动到函数外部来修复它,以便在第一次创建它,但我做了大量研究,仍然没有发现任何与创建大量相同的BroadcastChannel相关的内容会导致浏览器冻结


有人知道广播频道是如何工作的并解释为什么会发生这种情况吗?

频道接收器在做什么?您是否也向这些BC实例添加了一个侦听器?如果是这样的话,你的BC永远不会被垃圾收集,他们的侦听器会在每次发布新内容时触发。如果能在问题中更新@RexHenderson,您的接收者在哪里,即broadcast.onmessage handlers,请从sendData方法中设置新的广播频道