2

在我的共享工作者中使用可转移对象时,我在主线程中收到nullevent.data经过一番搜索,我发现这篇文章解释说ArrayBuffer当它通过 a 时总是MessagePort丢失MessageChannel

共享工作者通信也使用端口和消息通道完成。这是否意味着无法在SharedWorker实例中使用可转移对象?还是有一些解决方法?

我需要将一个巨大string的从SharedWorkerGlobalScope回传输到主线程。想法是将其转换ArrayBuffer为如本例所示的,然后传输缓冲区。据说这比发送字符串要快得多......

发送数据:

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;

}
4

1 回答 1

1

只需使用postMessage,无需转让。无论如何,字符串是不可转移的(所以它总是被复制的)。

拥有可转让的目标是在将对象从发送者传递到接收者时具有最小的成本。这样的消息可以跨越进程边界,并且进行进程间通信是昂贵的。这就是为什么MessagePort. 顺便说一句,跨进程通信的困难也是Safari 放弃对 SharedWorkers 支持的原因。

于 2015-12-09T14:08:28.210 回答