微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以通过广播频道API向Web Workers广播SharedArrayBuffer?

如何解决是否可以通过广播频道API向Web Workers广播SharedArrayBuffer?

广播频道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上的规范,内容为:

对于目的地中的每个目的地...

  1. 让数据成为StructuredDeserialize(serialized,targetRealm)。 如果引发异常,请捕获该异常,并使用MessageEvent在目标处激发一个名为messageerror的事件,并将origin属性初始化为sourceOrigin的序列化,然后中止这些步骤。

StructuredDeserialize是在https://html.spec.whatwg.org/multipage/structured-data.html#structureddeserialize上定义的,似乎表明它涵盖了SharedArrayBuffers:

  1. 否则,如果已序列化。[[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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?