问题描述
广播频道API 似乎是 postMessage 或 Channel Messaging API (又称为 MessageChannel )的替代。 ) 我已经在最新版本的Google Chrome浏览器中成功使用了这两种方法来发送共享数组缓冲区;但是,使用广播频道API发送共享数组缓冲区时遇到了麻烦。
Mozilla在https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel的文档引用了https://html.spec.whatwg.org/multipage/web-messaging.html#broadcastchannel上的规范,内容为:
对于目的地中的每个目的地...
StructuredDeserialize是在https://html.spec.whatwg.org/multipage/structured-data.html#structureddeserialize上定义的,似乎表明它涵盖了SharedArrayBuffers:
- 否则,如果已序列化。[[Type]]为“ SharedArrayBuffer”,则: 如果targetRealm的相应代理群集未序列化。[[AgentCluster]],则引发“ DataCloneError” DOMException。 否则,将值设置为targetRealm中新的SharedArrayBuffer对象,该对象的[[ArrayBufferData]]内部插槽值被序列化。[[ArrayBufferData]],并且其[[ArrayBufferByteLength]]内部插槽值被序列化。[[ArrayBufferByteLength]]。
阅读此书,在我看来这应该可行,但是我收到一个消息事件,其中的数据只是null
。
如果这是一个安全问题,我希望得到一个messageerror事件而不是一个消息事件。
这是我的最小测试用例:
broadcast-test.html(必须从http服务器提供-不能通过file://起作用)
<!DOCTYPE html>
<html>
<head><title></title></head>
<body>
<script src="broadcast-test.js"></script>
</body>
</html>
broadcast-test.js
const isThisTheWorker = this.document === undefined
const broadcastChannel = new broadcastChannel('foo')
if (!isThisTheWorker) {
broadcastChannel.addEventListener('message',(event) => {
console.log('main received',event.data)
const sab = new SharedArrayBuffer(100)
broadcastChannel.postMessage({ hello: 'from main',sab })
})
var myWorker = new Worker('broadcast-test.js')
}
else {
broadcastChannel.addEventListener('message',(event) => {
console.log('worker received',event.data)
})
broadcastChannel.postMessage({ hello: 'from worker' })
}
观察到的控制台输出:(Windows 10上为Chrome 84.0.4147.135)
主要收到了{hello:“来自工人”}
工人收到空值
Google Chrome的实现是否不正确,还是我误解了规范?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)