BroadcastChannel API调用postMessage时关闭状态下报错不一致问题
BroadcastChannel API postMessage() 异常行为疑问
在使用BroadcastChannel API时发现,当通道已关闭但调用postMessage()时,并非总会抛出异常,具体分为两种情况:
1. 同一实例调用close()后调用postMessage():会抛出异常
代码示例:
const bc1 = new BroadcastChannel('foo'); const bc2 = new BroadcastChannel('foo'); bc1.postMessage('bar'); bc2.addEventListener('message', (event) => console.log(event.data)); setTimeout(() => { bc1.close(); // 从bc1实例调用close(),后续将在同一实例调用postMessage }, 500); setTimeout(() => { try { bc1.postMessage('bar2'); } catch (error) { console.error('postMessage error', error); } }, 1000);
执行后会抛出异常:
postMessage error
Error: Failed to execute 'postMessage' on 'BroadcastChannel': Channel is closed
2. 不同实例调用close()后调用postMessage():不会抛出异常
代码示例:
const bc1 = new BroadcastChannel('foo'); const bc2 = new BroadcastChannel('foo'); bc1.postMessage('bar'); bc2.addEventListener('message', (event) => console.log(event.data)); setTimeout(() => { bc2.close(); // 从bc2实例调用close(),后续在bc1实例调用postMessage }, 500); setTimeout(() => { try { bc1.postMessage('bar2'); } catch (error) { console.error('postMessage error', error); } }, 1000);
该代码不会抛出异常,个人认为此情况应抛出异常。
咨询问题:
- 是否有办法检测第二种情况中通道是否已关闭?
- 若这是bug,应在哪里提交工单?
内容的提问来源于stack exchange,提问作者Envil
相关产品推荐
相关产品推荐

