Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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 是否可以通过广播频道API向网络工作者广播SharedArrayBuffer?_Javascript_Google Chrome_Web Worker_Broadcast Channel_Sharedarraybuffer - Fatal编程技术网

Javascript 是否可以通过广播频道API向网络工作者广播SharedArrayBuffer?

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

广播频道API似乎是postMessage频道消息API的替代品(又称MessageChannel) 我在谷歌Chrome的最新版本中成功地使用了这两种方法来发送共享阵列缓冲区;但是,使用广播通道API发送共享阵列缓冲区时遇到问题

Mozilla的doc at引用了规范at,其中说明:

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

  • 让数据为StructuredSerialize(序列化,targetRealm)。 如果此操作引发异常,请捕获它,在目标位置使用MessageEvent触发名为messageerror的事件,并将origin属性初始化为sourceOrigin的序列化,然后中止这些步骤
  • StructuredDeserialize在中定义,似乎表明它包含SharedArrayBuffers:

  • 否则,如果序列化的。[[Type]]为“SharedArrayBuffer”,则: 如果targetRealm对应的代理群集未序列化。[[AgentCluster]],则抛出“DataCloneError”DomeException。 否则,请将值设置为targetRealm中的新SharedArrayBuffer对象,该对象的[[ArrayBufferData]]内部插槽值已序列化。[[ArrayBufferData]],其[[ArrayBufferByTeleLength]]内部插槽值已序列化。[[ArrayBufferByTeleLength]]
  • 读到这篇文章,我觉得这应该行得通,但我得到了一个消息事件,其中数据只是
    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@altruios
    main接收到的消息事件{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' })
    }