在我的共享 worker 中使用可转移对象时,我在主线程中收到 event.data
的 null
。经过一番搜索,我找到了 this post其中解释了 ArrayBuffer
在通过 MessagePort
时总是丢失的 MessageChannel
.
Shared worker 通信也是使用端口和消息 channel 完成的。这是否意味着无法在 SharedWorker
中使用可转移对象?实例?或者有什么解决方法吗?
我需要从 SharedWorkerGlobalScope
传输一个巨大的 string
回到主线程。想法是将其转换为 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;
}
最佳答案
只需使用 postMessage
即可,无需转移。字符串无论如何都不可转移(因此它总是被复制)。
拥有可转让物的目标是在将对象从发送方传递到接收方时实现最低成本。这样的消息可以跨越进程边界,并且进行进程间通信是昂贵的。这是 the reason why transferables are not supported yet with MessagePort
.顺便说一句,跨进程通信的困难也是Safari dropped support for SharedWorkers的原因。 .
关于javascript - 与共享 worker 一起使用可转移对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34178004/