在共享工作程序中使用可传输对象时,我在主线程中收到null
event.data
。经过一些搜索后,我发现this post解释了ArrayBuffer
在通过MessagePort
的MessageChannel
时始终丢失。
还使用端口和消息通道完成共享工作者通信。这是否意味着无法在SharedWorker
实例中使用可转移对象?或者有一些解决方法吗?
我需要将string
从SharedWorkerGlobalScope
转移回主线程。我们的想法是将其转换为ArrayBuffer
,如this example所示,然后传输缓冲区。据说这比发送字符串要快得多......
发送数据:
var arrayBuffer = convertStringToArrayBuffer( string );
var data = {
message: "here is an array buffer",
arrayBuffer: arrayBuffer
};
port.postMessage(data, [data.arrayBuffer]);
接收数据:
worker.port.onmessage = function( event ) {
// data is null
var data = event.data;
}
答案 0 :(得分:1)
只使用postMessage
而不转让。无论如何,字符串都不可转移(因此它总是被复制)。
拥有转让广告的目标是在将对象从发件人传递到接收者时获得最低成本。这样的消息可以跨越进程边界,并且进行进程间通信是昂贵的。这是the reason why transferables are not supported yet with MessagePort
。顺便说一句,跨进程通信的困难也是Safari dropped support for SharedWorkers。