Javascript 传送射线的正确方法?

Javascript 传送射线的正确方法?,javascript,web-worker,Javascript,Web Worker,给定一个类型化数组(如Uint8Array),似乎有两种方法可以通过辅助程序传输它们 选项1 直接发送缓冲区并在接收端强制转换: 发件人:postMessage({fooBuffer:foo.buffer}[foo.buffer]) 接收器:const bar=new-Uint8Array(msg.data.fooBuffer) 选项2 发送TypedArray并仅传输其缓冲区: 发件人:postMessage({foo:foo}[foo.buffer]) 接收器:按原样使用foo 在我看来,

给定一个类型化数组(如Uint8Array),似乎有两种方法可以通过辅助程序传输它们

选项1

直接发送缓冲区并在接收端强制转换:

发件人:
postMessage({fooBuffer:foo.buffer}[foo.buffer])

接收器:
const bar=new-Uint8Array(msg.data.fooBuffer)

选项2

发送TypedArray并仅传输其缓冲区:

发件人:
postMessage({foo:foo}[foo.buffer])

接收器:按原样使用
foo


在我看来,选项2更可取,因为接收者不需要知道数据的类型,也不需要知道它的代码——但我一直只看到选项1风格的示例

更重要的是,在我当前的代码中,只有选项2起作用。我已确认数据已被传输,因为只有在发送后,
foo[0]
才会变得未定义


使用选项2可以吗,即使这不是我看到的示例代码的标准?

差异完全不重要。如果传递类型化数组,那么真正传递的只是关于它是什么类型的信息。无论如何,将使用移动的缓冲区创建阵列视图的新实例

所以这真的取决于你的需要

index.js
worker.js
好问题。根据,类型化数组是不可传输的,使用它们可能会复制内存。但声明并非如此。我不确定哪个是对的。也许这种困惑就是为什么ArrayBuffers在示例中更常见的原因……除非您愿意承担(经过计算的)风险,否则请选择选项1。这项技术仍然被认为是实验性的,当涉及到信息中还包括可转移对象的要求时,可能会变得更加严格(假设您的测试确实显示发生了转移,而不是复制操作)。谢谢。改善这个答案的几点建议:1。尝试/捕获在数据传输后对发送方的数据执行某些操作时出现的错误2。将其设置为在各种浏览器/操作系统中运行。除此之外,这似乎是一个受过良好教育的猜测:)@davidkomer我向您展示的代码是JSFIDLE示例,而不是生产代码。而try-catch在事件处理程序中是毫无意义的,除非您计划对错误做些什么,我没有。顺便说一下,如果你考虑回答的问题,记得把你的选择的解决方案当作接受的方式。看看这个分叉:它只是你的代码,它可以移除可转移的参数——但是同样的结果。保证所有事情正常工作的唯一方法是在发送数据之后对数据进行检查(从发送方的角度)。现在接受答案,直到有人可以通过规范中的来源或其他东西证明身份。谢谢你更新小提琴!
var worker = new Worker(url);

worker.addEventListener("error", function(e) {
    console.warn("Worker error:", e);
});
worker.addEventListener("messageerror", function(e) {
    console.warn("Message error:", e);
});

var arrayBuffer = new Float64Array([1,2,3,4,5]).buffer;
var array = new Float64Array([1,2,3,4,5])
worker.postMessage({name:"buffer", data:arrayBuffer}, [arrayBuffer]);
worker.postMessage({name:"array", data:array}, [array.buffer]);
  self.onmessage = function(e) {
    switch(e.data.name) {
      case "buffer" : 
          console.log("Array buffer:", new Float64Array(e.data.data))
      break;
      case "array": 
          console.log("Array:", e.data.data);
          break;
      default:
        console.error("Unknown message:", e.data.name);
    }
  }