Javascript 是否可以通过广播频道API向网络工作者广播SharedArrayBuffer?
广播频道API似乎是postMessage或频道消息API的替代品(又称MessageChannel) 我在谷歌Chrome的最新版本中成功地使用了这两种方法来发送共享阵列缓冲区;但是,使用广播通道API发送共享阵列缓冲区时遇到问题 Mozilla的doc at引用了规范at,其中说明: 对于目的地中的每个目的地Javascript 是否可以通过广播频道API向网络工作者广播SharedArrayBuffer?,javascript,google-chrome,web-worker,broadcast-channel,sharedarraybuffer,Javascript,Google Chrome,Web Worker,Broadcast Channel,Sharedarraybuffer,广播频道API似乎是postMessage或频道消息API的替代品(又称MessageChannel) 我在谷歌Chrome的最新版本中成功地使用了这两种方法来发送共享阵列缓冲区;但是,使用广播通道API发送共享阵列缓冲区时遇到问题 Mozilla的doc at引用了规范at,其中说明: 对于目的地中的每个目的地 让数据为StructuredSerialize(序列化,targetRealm)。 如果此操作引发异常,请捕获它,在目标位置使用MessageEvent触发名为messageerror
null
。
如果这是一个安全问题,我希望得到一个messageerror事件而不是message事件
以下是我的最小测试用例:
broadcast-test.html(必须从http服务器提供-无法通过以下文件工作:/)
观察到的控制台输出:(Windows 10上的Chrome 84.0.4147.135)
main收到{hello:“来自worker”}
工人接收到空值
Google Chrome的实现不正确,还是我误解了规范?当控制台记录事件时会发生什么?(不是event.data)应该有效和实际有效是两件不同的事情——某些东西“在标准中”这一事实并不意味着它已经实现了(尚未实现)。。。。哦,而且它在firefox中也不起作用way@altruios
main接收到的消息事件{isTrusted:true,数据:{…},来源:http://localhost:1234,lastEventId:,source:null,…}
广播测试。js:50工作者收到消息事件{isTrusted:true,数据:null,来源:http://localhost:1234,lastEventId:“,source:null,…}
在这个空间中有太多被忽略的属性要发布,使用它将更难使其工作…当您控制台记录事件时会发生什么?(不是event.data)应该有效和实际有效是两件不同的事情——某些东西“在标准中”这一事实并不意味着它已经实现了(尚未实现)。。。。哦,而且它在firefox中也不起作用way@altruiosmain接收到的消息事件{isTrusted:true,数据:{…},来源:http://localhost:1234,lastEventId:,source:null,…}
广播测试。js:50工作者收到消息事件{isTrusted:true,数据:null,来源:http://localhost:1234,lastEventId:“,source:null,…}
此空间中有太多被忽略的属性要发布,并且使用它将更难使其工作。。。
<!DOCTYPE html>
<html>
<head><title></title></head>
<body>
<script src="broadcast-test.js"></script>
</body>
</html>
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' })
}