传递TypedArrays的正确方法?

时间:2017-11-21 16:16:45

标签: javascript web-worker

给定像Uint8Array这样的类型数组,似乎有两种方法可以通过worker传输它们。

选项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,即使它不是我看到的示例代码的标准吗?

1 个答案:

答案 0 :(得分:2)

差异非常微不足道。如果你传递了类型化的数组,那么你真正传递的只是它是什么类型的信息。无论如何,将使用移动的缓冲区创建数组视图的新实例。

因此,它完全取决于您的需求。 Either way works, check this fiddle

index.js

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]);

worker.js

  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);
    }
  }