dav*_*mer 6 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按原样使用。
在我看来,选项 2 更可取,因为接收者不需要了解数据的类型,并且代码较少 - 但我不断遇到仅采用选项 1 风格的示例。
更重要的是,在我当前的代码中,只有选项 2 有效。我已经确认数据已传输,因为仅在发送后才foo[0]变得未定义。
使用选项 2 可以吗,即使它不是我看到的示例代码的标准?
差异完全微不足道。如果您传递类型化数组,那么您真正传递的只是有关其类型的信息。无论如何,将使用移动的缓冲区创建数组视图的新实例。
所以这真的取决于你的需求。无论哪种方式都有效,请检查这个小提琴。
index.jsvar 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]);
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)